Ошибка при определении внутренних классов в классе Test в JUnit - PullRequest
9 голосов
/ 11 ноября 2010

У меня возникают некоторые проблемы при определении внутренних классов в классе Test, унаследованном от TestCase, для JUnit 3. Сценарий похож на следующий:

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() { ... }
}

Теперь, если я запускаю это из Eclipse, тесты запускаются нормально, но если я пытаюсь запустить из задачи Ant, это не получается:

[junit] junit.framework.AssertionFailedError: Класс Foo $ Bar не имеет открытого конструктора TestCase (String name) или TestCase ()

Bar НЕ является классом Test, это просто подкласс Foo, переопределяющий некоторый метод, который мне не нужен, чтобы делать реальные вещи при тестировании.

В данный момент я совершенно растерян и не знаю, как решить эту проблему. Является ли единственный способ создать подклассы как автономные?

Ответы [ 4 ]

16 голосов
/ 22 марта 2012

Это потому, что вы включили вложенный класс в набор файлов junit.Добавьте свойство «исключает» в свой build.xml.

Например:

<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>  
5 голосов
/ 11 ноября 2010

Вы можете попробовать определить класс Bar как статический:

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

... но тот факт, что он работает в одной среде, а не в другой, предполагает одну из двух вещей:

  1. Java-версия
  2. Classpath
  3. [Редактировать: как предложено Джимом ниже] Различные версии junit.jar
4 голосов
/ 25 марта 2011

Я чувствую себя некростером, но дело в том, что сегодня я столкнулся с подобной проблемой с maven.

Обычный mvn test работает хорошо, но когда я хочу запустить тесты из определенного пакета, например mvn test -Dtest=com.test.* - initializationError, выбрасывается.Это «работает» как для Junit 3, так и для 4.

Я нашел причину для моего случая maven, это может быть то же самое для муравья.Дело в том, что по умолчанию тестовый плагин maven (то есть верный) рассматривает только определенное подмножество всех классов как «тестовые классы», а именно ищет их по имени, например, * Test и т. Д. (Об этом вы можете прочитать на домашняя страница surefire ). Когда мы определяем свойство test, мы полностью переопределяем поведение по умолчанию.Это означает, что с -Dtest=com.test.* верный выбор получит не только com.test.MyTestClass, но также com.test.MyTestClass.InnerClass и даже com.test.MyTestClass$1 (то есть анонимные классы).

Таким образом, чтобы запустить, например, классы из некоторого пакета, вы должныиспользуйте что-то вроде -Dtest=com.test.*Test (если вы используете суффиксы для определения тестовых классов, конечно).

3 голосов
/ 29 июля 2012

Вы также можете аннотировать вложенный класс @Ignore, если не хотите исключать все внутренние классы.

...