2012-04-17 20 views
5

Chciałbym zarejestrować niektóre zasięgi internetowe w kontekście sprężyny w mojej metodzie @BeforeTest. Ale okazuje się, że kontekst wiosny wciąż jest w tym punkcie.Uzyskiwanie dostępu do kontekstu sprężynowego w testng @BeforeTest

Test działa dobrze, jeśli zmienię na @BeforeMethod. Zastanawiam się, jak mogę uzyskać dostęp do kontekstu w @BeforeTest, ponieważ nie chcę, aby kod rejestracyjny zakresu był powtarzany dla każdej metody testowej.

Poniżej znajdują się fragmenty kodu.

public class MyTest extends MyBaseTest { 
    @Test public void someTest() { /*...*/ } 
} 

@ContextConfiguration(locations="/my-context.xml") 
public class MyBaseTest extends AbstractTestNGSpringContextTests { 
    @BeforeTest public void registerWebScopes() { 
     ConfigurableBeanFactory factory = (ConfigurableBeanFactory) 
       this.applicationContext.getAutowireCapableBeanFactory(); 
     factory.registerScope("session", new SessionScope()); 
     factory.registerScope("request", new RequestScope()); 
    } 

    /* some protected methods here */ 
} 

Oto komunikat o błędzie podczas uruchamiania testu:

 
FAILED CONFIGURATION: @BeforeTest registerWebScopes 
java.lang.NullPointerException 
    at my.MyBaseTest.registerWebScopes(MyBaseTest.java:22) 

Odpowiedz

12

połączeń springTestContextPrepareTestInstance() w BeforeTest metody.

+0

Czy znasz dokumentację dotyczącą tego, dlaczego wstrzyknięci członkowie nie są dostępni w metodach '@ BeforeTest', a nawet' @ BeforeSuite'? – ecbrodie

+0

10x :) łatwiej jest wtedy pisać procesor postu bean –

2

TestNG uruchamia metody @BeforeTest przed metodami @BeforeClass. springTestContextPrepareTestInstance() jest opatrzony przypisami @BeforeClass i ustawia applicationContext. Dlatego właśnie applicationContext jest nadal metodą null. @BeforeTest służy do otwierania oznaczonej grupy testów. (Nie działa przed każdą metodą @Test, więc jest trochę mylące).

Zamiast używać @BeforeTest, prawdopodobnie powinieneś używać @BeforeClass (który jest uruchamiany raz, przed pierwszym @Test w bieżącej klasie). Bądź pewien, że to zależy od springTestContextPrepareTestInstance metody, jak w

@BeforeClass(dependsOnMethods = "springTestContextPrepareTestInstance") 
public void registerWebScopes() { 
    ConfigurableBeanFactory factory = (ConfigurableBeanFactory) 
      this.applicationContext.getAutowireCapableBeanFactory(); 
    factory.registerScope("session", new SessionScope()); 
    factory.registerScope("request", new RequestScope()); 
} 

The @BeforeMethod prac też (jak wspomniano), ponieważ działają one po @BeforeClass metod.

+0

"' @ BeforeClass' (uruchomić przed dowolnym '@ Testami" w obecnej klasie) ". <- To jest nieprawidłowe. Jak stwierdzono w [Dokumentacja TestNG] (http://testng.org/doc/documentation-main.html), '@ BeforeClass' zostanie uruchomiony przed wywołaniem ** pierwszej ** metody testowej w bieżącej klasie. – JonyD

+0

@JonyD, dzięki za wskazanie tego, sformułowanie nie jest jasne. Edytowałem to na podstawie Twojej sugestii. – kuporific