Junit4: @RunWith(MyCustomRunner.class) - IllegalAccessException

Erstellt am 5. Dez. 2018  ·  3Kommentare  ·  Quelle: junit-team/junit4

Hi,

Ich habe versucht, verschiedene Arten von "Custom Runners" zu implementieren, um mich mit dem Konzept der JUnit Custom Runners vertraut zu machen.
aber jeder einzelne von ihnen macht die gleiche Ausnahme und ich bin zu dumm, um herauszufinden, warum.

Ich habe folgenden Test geschrieben:

@RunWith(MyYetAnotherRunner.class)
public class BestPracticesForUsingJUnit_OwnRunner2 {
    <strong i="9">@Test</strong>
    public void one() {
    }
    <strong i="10">@Test</strong>
    public void two() {
    }
    <strong i="11">@Test</strong>
    public void three() {
    }
}

Mit der Klasse "Custom Runner" wie folgt:

class MyYetAnotherRunner extends Runner {
    private Class<?> testClass;
    public MyYetAnotherRunner(Class<?> testClass) {
        super();
        this.testClass = testClass;
    }
    <strong i="15">@Override</strong>
    public Description getDescription() {
        return Description.createTestDescription(testClass, "My runner description");
    }
    <strong i="16">@Override</strong>
    public void run(RunNotifier notifier) {
        System.out.println("running the tests from MyRunner: " + testClass);
        try {
            Object testObject = testClass.newInstance();
            for (Method method : testClass.getMethods()) {
                if (method.isAnnotationPresent(Test.class)) {
                    notifier.fireTestStarted(Description.createTestDescription(testClass, method.getName()));
                    method.invoke(testObject);
                    notifier.fireTestFinished(Description.createTestDescription(testClass, method.getName()));
                }
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Ich habe auch mein Glück versucht, indem ich von BlockJUnit4ClassRunner , aber auch ohne Erfolg:

class MyRandomBlockJUnit4ClassRunner extends BlockJUnit4ClassRunner {
    public MyRandomBlockJUnit4ClassRunner(Class<?> klass) throws InitializationError {
        super(klass);
    }
    protected java.util.List<org.junit.runners.model.FrameworkMethod> computeTestMethods() {
        java.util.List<org.junit.runners.model.FrameworkMethod> methods = super.computeTestMethods();
        Collections.shuffle(methods);
        return methods;
    }
}

Ich führe die Tests in Eclipse aus, indem ich mit der rechten Maustaste auf Test-Klasse BestPracticesForUsingJUnit_OwnRunner2 -> Ausführen als -> JUnit-Test klicke.

In jedem Fall lautet der Fehler-Stacktrace:

java.lang.IllegalAccessException: Class org.junit.internal.builders.AnnotatedBuilder can not access a member of class 
part2.ch9.RandomBlockJUnit4ClassRunner with modifiers "public"
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
    at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)
    at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:413)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:87)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:73)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:46)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:522)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

Seltsam ist, dass mit dem vorimplementierten Parameter.class -JUnit-Test-Runner alles funktioniert.

Was ist falsch?

Ist es etwas mit Eclipse?

Hilfreichster Kommentar

Keine Sorge!

Alle 3 Kommentare

Die Läuferklasse muss public .

entschuldigen Sie, dass ich ein Ticket geöffnet habe und Sie mit so trivialen Dingen belästigt habe.

Möge dieses Ticket, das es nicht einmal wert ist, im geschlossenen Ticketbereich zu sein, in den Tiefen des JUnit-Github-Repo verschwinden.

Keine Sorge!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen