2010-11-11 19 views
9

Mam pewne problemy przy definiowaniu klas wewnętrzne w klasie testu odziedziczonym TestCase, na JUnit 3. scenariusz jest jak następuje:Błąd podczas definiowania klas wewnętrzne w klasie test w JUnit

Foo.java

public class Foo { 
    public void method() { ... } 
} 

FooTest.java

public class FooTest extends TestCase { 
    public class Bar extends Foo { 
    public void method() { ... } 
    } 
    public void testMethod() { ... } 
} 

teraz, jeśli uruchomię to z Eclipse, testy uruchomić ok, ale gdy próbuję uruchomić z Ant zadanie nie powiedzie:

[junit] junit.framework.AssertionFailedError: Klasa Foo $ bar ma TestCase konstruktora publicznego (String name) lub TestCase()

bar nie jest klasa Test, to tylko podklasą Foo nadrzędnymi jakąś metodę, która Nie muszę robić prawdziwych rzeczy podczas testów.

Jestem w tej chwili dość zagubiony i nie wiem, jak podejść do tego problemu. Czy jedynym sposobem na stworzenie podklas jako samodzielne?

+0

Jaka jest konfiguracja Anta do uruchamiania testów? –

Odpowiedz

15

Dzieje się tak dlatego, że do zestawu plików junit dołączono klasę zagnieżdżoną. Dodaj właściwość "excludes" do pliku build.xml.

Na przykład:

<target name="test" depends="test-compile"> 
    <junit> 
     <batchtest todir="${test.build.dir}" unless="testcase"> 
      <fileset dir="${test.build.classes}" 
       includes = "**/Test*.class" 
       excludes = "**/*$*.class"/> 
     </batchtest> 
    </junit> 
</target> 
+0

To jest faktycznie lepsze rozwiązanie niż @Ignore, ponieważ wewnętrzne klasy nie pojawiają się w ogóle w plikach wyników testu, gdy są wykluczone w pliku build.xml. Oba rozwiązania działają jednak. – joscarsson

+0

Dzięki za tę odpowiedź pomogłeś mi zrozumieć, dlaczego test mrówek na mrówkę został zakazany tylko dlatego, że mam prywatną klasę wewnętrzną. Instrukcja exclude rozwiązała problem. – JulianHarty

+0

Używam '' z zagnieżdżonym '' z 'refid'. Nie możesz zmienić '' ale nadal możesz wstawić element '' wewnątrz '' aby usunąć wewnętrzne klasy które '' zawierało. –

5

Można spróbować określające klasę Bar jako statyczne:

public class FooTest extends TestCase { 
    public static class Bar extends Foo { 
    public void method() { ... } 
    } 
    public void testMethod() { ... } 
} 

... ale fakt, że to działa w jednym środowisku, ale nie w inny sugeruje jedną z dwóch rzeczy:

  1. Java wersja
  2. Classpath
  3. [Edit: jak sugeruje Jim poniżej] Różne wersje junit.jar
+1

+1 Dodałbym jeszcze: różne wersje junit.jar. Jest możliwe, że starsza wersja JUnit jest zagubiona przez zagnieżdżoną niestatyczną klasę. –

4

Czuję się jak necrposter, ale chodzi o to, że wpadłem dzisiaj na podobny problem z mavenem.

Zwykle mvn test działa dobrze, ale gdy chcę uruchomić testy z określonego pakietu, takiego jak mvn test -Dtest=com.test.* - initializationError, zostanie zgłoszony. To "działa" zarówno dla Junit 3, jak i 4.

Znalazłem powód mojej przypadkowości, może to być takie samo dla mrówki. Chodzi o to, że domyślnie wtyczka testowa maven (surefire is) traktuje tylko określony podzbiór wszystkich klas jako "klasy testowe", a mianowicie przeszukuje je według nazwy, np. * Test i tak dalej (można o tym przeczytać pod adresem surefire's home page) .Podczas definiowania właściwości test całkowicie zastępujemy domyślne zachowanie. Oznacza to, że z -Dtest=com.test.* surefire odbierze nie tylko com.test.MyTestClass, ale także com.test.MyTestClass.InnerClass, a nawet com.test.MyTestClass$1 (tj. Anonimowe klasy).

Aby uruchomić np. klasy z jakiegoś pakietu powinieneś użyć czegoś takiego jak -Dtest=com.test.*Test (jeśli używasz przyrostków do identyfikacji klas testowych oczywiście).

3

Można również opisywanie zagnieżdżony klasy @Ignore jeśli nie chcesz, aby wykluczyć wszystkie klasy wewnętrzne.

+1

To nie działa w przypadku anonimowych klas wewnętrznych. @Inotore Adnotacja jest tutaj niepoprawna. –

+0

To prawda, ale pytanie nie dotyczyło anonimowych klas wewnętrznych. –