2009-10-29 15 views
8

Mamy wiele testów integracji napisanych przy użyciu JUnit , ale teraz używamy ich z 4.4. Kilka z nich potrzebuje metody tearDown, która działa po zakończeniu wszystkich testów w klasie (w celu uwolnienia niektórych wspólnych zasobów).Usuwanie klasy w junit 3?

Widzę, że można to zrobić na junicie 4 za pomocą @AfterClass (org.junit). Jednak wymieszanie tego w istniejących junitowych 3 testach rozszerzających TestCase (junit.framework. *) Nie działa. [BTW jest jeszcze narzędziem do migracji? Pytanie 264680 wskazano, że nie było go rok temu.]

Widziałem wzmiankę o używaniu junit.extensions.TestSetup dla tego rodzaju rzeczy. Moje krótkie testowanie tego nie wydawało się działaniem. Dowolne przykłady?

+0

Załóżmy, że nie masz czasu, obecnie ręcznie konwertować i zweryfikować wszystkie testy (i szkolić wszystkich zaangażowanych programistów na temat korzystania z adnotacji JUnit 4), ale po prostu chcę zająć się kilkoma klasami, które wymagają ekwiwalentu AfterClass na junit 3. –

Odpowiedz

18

Znaleźliśmy odpowiedź na moje własne pytanie :) Próbowałem tego krótko przed opublikowaniem mojego pytania, ale to nie działało dla mnie. Ale teraz zdaję sobie sprawę, że dzieje się tak, ponieważ nasza struktura testowa wywołuje junit inaczej niż domyślną, więc nie wywoływała metody "suite", która jest potrzebna w następującym rozwiązaniu. W Eclipse, jeśli użyję pakietu junit w pakiecie do bezpośredniego wykonania jednego Test/TestCase, działa dobrze.

Sposób wykonania tej konfiguracji/wygaśnięcia raz na klasę w pakiecie 3 polega na użyciu TestSuite. Oto przykład na junit.org:

Is there a way to make setUp() run only once?

public static Test suite() { 
    return new TestSetup(new TestSuite(YourTestClass.class)) { 

     protected void setUp() throws Exception { 
      System.out.println(" Global setUp "); 
     } 
     protected void tearDown() throws Exception { 
      System.out.println(" Global tearDown "); 
     } 
    }; 
} 
+0

czy uruchomiłeś to na Androida? Mam dokładnie ten sam kod, ale otrzymuję wyjątek ClassNotFound. Czy zdążyłeś już to zrobić? Czy YourTestClass rozszerza TestCase? –

+0

Mogę wykonać mój test z tym kodem teraz, ale wygląda na to, że metoda suite() nie jest wywoływana. Co zrobiłeś, aby wykonać takie połączenie z tą metodą? I choć byłoby to automatycznie nazywane –

+0

@FelipeMosso, jeśli powiesz JUnit (lub twojemu IDE), aby uruchomił pojedynczą klasę testową w stylu JUnit3 i ta klasa ma publiczną statyczną metodę 'suite()', która zwraca 'Test' (lub podklasę testu), wtedy metoda 'suite()' zostanie wywołana, aby wygenerować pakiet. Ale jeśli samodzielnie tworzysz pakiety, musisz upewnić się, że używana jest metoda suite() (prawdopodobnie za pomocą konstruktora 'TestSuite', który przyjmuje klasę) – NamshubWriter

3

W JUnit 4, twoja klasa testowa nie musi przedłużać TestCase. Zamiast tego należy upewnić się, że nazwa klasy testowej jest zgodna z *Test, a każda z metod testowania jest opatrzona przypisami z @Test. Czy próbowałeś wprowadzić te zmiany, a następnie dodałeś adnotację @AfterClass do odpowiedniej metody?

Istnieją adnotacje, które zastępują większość/wszystkie funkcje, których obecnie używasz od TestCase.

+0

Równolegle do próby rozpadu klasy, próbuję po prostu przekształcić jedną adnotację klasy 4 na junit. Nie mając jeszcze szczęścia, ponieważ Eclipse/command-line uważa, że ​​nie mam żadnych testów do uruchomienia. –

+0

Uaktualniłem moją odpowiedź, moja rada była całkowicie błędna i zasługuję na to, że zostałem wtrącony do piekła. Postępuj zgodnie z instrukcjami powyżej i spróbuj ponownie. –

Powiązane problemy