2009-07-01 8 views
6

SuiteClasses będzie działać dobrze z listą klas jak {Test1.class,Test2.class}, ale gdy próbuję wygenerować statyczną listę klas, mówi niezgodne typy: wymagana java.lang.Class<?> ale okazało java.lang.Class<?>[]JUnit SuiteClasses ze statycznym wykazu klas

czego mi brakuje?

@RunWith(Suite.class) 

@Suite.SuiteClasses(TestSuite.classes) 
public class TestSuite { 

    public static Class<?> [] classes; 

    static { 
     classes = new Class<?> [1]; 
     classes[0] = MyTest.class; 
    } 
} 
+0

Czy rzeczywiście mają miejsce pomiędzy a []? Jeśli tak, usuń to miejsce. – AlbertoPL

+1

Ta przestrzeń nic nie znaczy, to fakt, że próbuje umieścić tablicę tam, gdzie jej nie należy (nawet jeśli nazwy klas są w praktyce wymieniane jako {M1.class, M2.class}). – amischiefr

Odpowiedz

21

To nie powinno naprawdę działać. Masz zamiar umieścić tablicę w adnotacji jako stałą. Nawet jeśli minie ten problem, kompilator odrzuci go. To, co musisz zrobić, to:

@RunWith(Suite.class) 

@Suite.SuiteClasses({MyTest.class, MyOtherTest.class}) 
public static class TestSuite { 
} 

Zwróć uwagę na zwężające się nawiasy.

Jestem pewny, że próbujesz się dostać, aby móc dynamicznie budować listę klas w pakiecie.

I przedłożyli request się im pozwolić, ale w tym czasie jedynym sposobem na to jest do podklasy klasy Suite tak:

public class DynamicSuite extends Suite { 

    public DynamicSuite(Class<?> setupClass) throws InitializationError { 
     super(setupClass, DynamicSuiteBuilder.suite()); 
    } 
} 


@RunWith(DynamicSuite.class) 
public class DynamicSuiteBuilder { 
    public static Class[] suite() { 
     //Generate class array here. 
    } 
} 
+0

Podklasy "Suite" bardzo mi pomogły. W odróżnieniu od używania runnera '@RunWith (AllTests.class), podejście to respektuje również' @ ClassRule' samego pakietu, a także zawarte w nim klasy. – Alex

+0

Próbowałem tego podejścia do wdrożenia setUp i tearDown. Ale konstruktor DynamicSuite jest wywoływany przed @ beforeclass. Czy istnieje sposób, w jaki @ beforeclass można wywołać przed konstruktorem. – Shree

1

@SuiteClasses jest adnotacja klasy zdefiniowane w JUnit 4.4 w org.junit.runners.Suite.SuiteClasses. Umożliwia zdefiniowanie klasy zestawu, jak opisano w poprzednim pytaniu.

Nawiasem mówiąc, dokument API JUnit 4.4 zawiera główną literówkę dla klasy org.junit.runners.Suite (Suite.html).

Używanie Suite jako biegacza pozwala ręcznie utworzyć zestaw zawierający testy z wielu klas. Jest to równoważnik JUnit 4 metody statycznej JUnit 3.8.x Test suite(). Aby z niego skorzystać, należy dodać adnotację do klasy za pomocą @RunWith(Suite.class) i @SuiteClasses(TestClass1.class, ...). Po uruchomieniu tej klasy uruchomione zostaną wszystkie testy we wszystkich klasach pakietów.

@SuiteClasses(TestClass1.class, ...) należy zmienić na @Suite.SuiteClasses({TestClass1.class, ...}).

Ktoś podał błędne informacje na temat zestawu testów kompilacji w JUnit 4.4. Nie wykonuj tego:

JUnit udostępnia narzędzia do definiowania pakietu, który ma być uruchamiany i wyświetlania jego wyników. Aby uruchomić testy i zobaczyć wyniki na konsoli uruchom:

org.junit.runner.TextListener.run(TestClass1.class, ...); 

więcej szczegółów kliknij na http://edugoing.com/qna/index.php?qa=1&qa_1=what-the-difference-between-an-interface-and-abstract-class

+1

Link wskazuje na stronę z treścią bez reklam ... –

Powiązane problemy