2010-04-09 20 views
43

wiosennym wsparcia JUnit całkiem dobrze na tym: z dopiskiem RunWith i ContextConfiguration, wszystko wygląda bardzo intuicyjnyWiosna Dependency Injection z TestNG

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:dao-context.xml") 

Ten test będzie w stanie uruchomić zarówno w Eclipse & Maven poprawnie. Zastanawiam się, czy jest coś podobnego do TestNG. Zastanawiam się nad przejściem do tej struktury "następnej generacji", ale nie znalazłem dopasowania do testów z wiosną.

Odpowiedz

51
+0

Dzięki. Właśnie tego szukam. –

+4

Co za bałagan. Po pierwsze wymusza określoną hierarchię klas. Po drugie jest dość mylące, ponieważ przypadek testowy, w którym używa się '@ Transactional', może przez pomyłkę wydłużyć wersję nietransakcyjną. Ale niestety nie ma innego sposobu na użycie Springa z TestNG. –

+0

@GrzesiekD. Mam nadzieję, że coś się zmieniło za 4,5 roku. :) Proszę więc sprawdzić status quo. – lexicore

23

Oto przykład, który pracował dla mnie:

import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; 
import org.testng.annotations.Test; 

@Test 
@ContextConfiguration(locations = {"classpath:applicationContext.xml"}) 
public class TestValidation extends AbstractTestNGSpringContextTests { 

    public void testNullParamValidation() { 
     // Testing code goes here! 
    } 
} 
17

Wiosna i T EstNG działa dobrze razem, ale są pewne rzeczy, o których należy pamiętać. Oprócz podklasowania AbstractTestNGSpringContextTests, musisz zdawać sobie sprawę z tego, w jaki sposób współdziała ze standardowymi adnotacjami konfiguracji/odkładania TestNG.

TestNG ma cztery poziomy ustawień

  • BeforeSuite
  • BeforeTest
  • BeforeClass
  • BeforeMethod

które występują dokładnie tak, jak można się spodziewać (świetny przykład samodokumentujące API). Wszystkie one mają opcjonalną wartość zwaną "dependOnMethods", która może przyjąć String lub String [], czyli nazwę lub nazwy metod na tym samym poziomie.

Klasa AbstractTestNGSpringContextTests ma metodę opisaną przez BeforeClass o nazwie springTestContextPrepareTestInstance, w której należy ustawić metodę instalacji, aby była zależna od tego, czy używa się w niej klasy autowyred. W przypadku metod nie musisz się martwić o autowiring, ponieważ występuje, gdy klasa testowa jest skonfigurowana w tym przed metody klasy.

To pozostawia pytanie, w jaki sposób można użyć klasy autowired w metodzie opisanej w BeforeSuite. Możesz to zrobić, ręcznie wywołując springTestContextPrepareTestInstance - chociaż nie jest to domyślnie ustawione, aby to zrobić, zrobiłem to kilka razy z powodzeniem.

Tak więc, aby zilustrować, zmodyfikowaną wersję przykład Arup za:

import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; 
import org.testng.annotations.Test; 

@Test 
@ContextConfiguration(locations = {"classpath:applicationContext.xml"}) 
public class TestValidation extends AbstractTestNGSpringContextTests { 

    @Autowired 
    private IAutowiredService autowiredService; 

    @BeforeClass(dependsOnMethods={"springTestContextPrepareTestInstance"}) 
    public void setupParamValidation(){ 
     // Test class setup code with autowired classes goes here 
    } 

    @Test 
    public void testNullParamValidation() { 
     // Testing code goes here! 
    } 
} 
+0

Metoda org.springframework.test.context.testng.AbstractTestNGSpringContextTests # springTestContextPrepareTestInstance ma już adnotację @BeforeClass, więc to rozwiązanie wydaje mi się zbędne. –

+1

To rozwiązanie umożliwia dodanie do testu kodu zależnego od pola autowire. "springTestContextPrepareTestInstance" będący metodą "przed klasą" nie gwarantuje, że będzie działał przed "przed klasą" podklasy - musisz jawnie ustawić pole dependsOnMethods – romeara

+2

Niestety to nie działa dla mnie. Domyślnie '@ Autowire' wydaje się mieć miejsce BARDZO późno, po @BeforeTest (ale przed @ Test). Próbowałem dodając dependOnMethods, ale potem dostaję: MyClass jest zależny od metody protected void org.springframework.test.context.testng.AbstractTestNGSpringContextTests.springTestContextPrepareTestInstance() wyrzuca java.lang.Exception, który nie jest opatrzony adnotacją @Test ... – dmansfield

Powiązane problemy