11 Stimmen

Benötigen JUnit4-Testklassen einen öffentlichen no arg-Konstruktor?

Ich habe eine Testklasse, die in JUnit4-Syntax geschrieben ist und in Eclipse mit der Option "run as junit test" ausgeführt werden kann, ohne zu scheitern. Wenn ich denselben Test über ein Ant-Target ausführe, erhalte ich diesen Fehler:

java.lang.Exception: Test class should have public zero-argument constructor
at org.junit.internal.runners.MethodValidator.validateNoArgConstructor(MethodValidator.java:54)
at org.junit.internal.runners.MethodValidator.validateAllMethods(MethodValidator.java:39)
at org.junit.internal.runners.TestClassRunner.validate(TestClassRunner.java:33)
at org.junit.internal.runners.TestClassRunner.<init>(TestClassRunner.java:27)
at org.junit.internal.runners.TestClassRunner.<init>(TestClassRunner.java:20)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26)
at junit.framework.JUnit4TestAdapter.<init>(JUnit4TestAdapter.java:24)
at junit.framework.JUnit4TestAdapter.<init>(JUnit4TestAdapter.java:17)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:386)
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:911)
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:768)
Caused by: java.lang.NoSuchMethodException: dk.gensam.gaia.business.bonusregulering.TestBonusregulerAftale$Test1Reader.<init>()
at java.lang.Class.getConstructor0(Class.java:2706)
at java.lang.Class.getConstructor(Class.java:1657)
at org.junit.internal.runners.MethodValidator.validateNoArgConstructor(MethodValidator.java:52)

Ich habe keinen öffentlichen no arg-Konstruktor in der Klasse, aber ist das wirklich notwendig?

Das ist mein Ameisen-Ziel

<target name="junit" description="Execute unit tests" depends="compile, jar-test">
        <delete dir="tmp/rawtestoutput"/>
        <delete dir="test-reports"/>
        <mkdir dir="tmp/rawtestoutput"/>
        <junit printsummary="true" failureproperty="junit.failure" fork="true">
          <classpath refid="class.path.test"/>
          <classpath refid="class.path.model"/>
          <classpath refid="class.path.gui"/>
          <classpath refid="class.path.jfreereport"/>
            <classpath path="tmp/${test.jar}"></classpath>
          <batchtest todir="tmp/rawtestoutput">
            <fileset dir="${build}/test">
                <include name="**/*Test.class" />
                <include name="**/Test*.class" />
            </fileset>
          </batchtest>
        </junit>
        <junitreport todir="tmp">
          <fileset dir="tmp/rawtestoutput"/>
          <report todir="test-reports"/>
        </junitreport>
        <fail if="junit.
failure" message="Unit test(s) failed.  See reports!"/>
    </target>

Die Testklasse hat keine Konstruktoren, aber sie hat eine innere Klasse mit Standardmodifikator. Sie hat auch eine anonyme innere Klasse. Beide inneren Klassen geben den Fehler "Test class should have public zero-argument constructor". Ich verwende Ant Version 1.7.1 und JUnit 4.7

1voto

JesperE Punkte 61161

Mit einem no-arg-Konstruktor lassen sich Testklassen zu Suiten zusammenfassen:

 TestSuite suite = new TestSuite();
 suite.add(TestClass.class);
 ...

1voto

benvolioT Punkte 4477

Bei älteren Versionen von junit tritt dieses Problem auf, wenn Sie das Wort "Test" in Ihrer inneren Klasse haben.

Wir stießen auf dieses Problem bei der Implementierung des Musters "Unterklasse für Test", indem wir die Unterklasse z. B. FooForTest nannten. Durch Umbenennung in FooSubclass wurde das Problem gelöst.

Siehe den obigen Kommentar von @Vineet Reynolds für weitere Details über die betroffenen Junit-Versionen und warum dies bei Ant, aber nicht bei Eclipse passiert.

Ich hoffe, das hilft!

0voto

akuhn Punkte 26637

Nicht-statische innere Klassen haben einen versteckten Konstruktor, der die äußere Klasse als Argument nimmt. Wenn Ihre inneren Klassen keinen Zustand mit den äußeren Klassen teilen, machen Sie sie einfach static .

0voto

Könnte daran liegen, dass Sie Enclosed.class verwenden, dann müssen die eingeschlossenen Klassen statique

@RunWith(Enclosed.class)
public class MyClassThatCointaintTestClasses {
    public static class Class1Test {
@Test
public void test1(){
}
@Test
public void test2(){
}
}

public static class Class2Test {
@Test
public void test21(){
}
@Test
public void test22(){
}
}

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X