Junit4: @RunWith(MyCustomRunner.class) - IllegalAccessException

์— ๋งŒ๋“  2018๋…„ 12์›” 05์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: junit-team/junit4

์•ˆ๋…•ํ•˜์„ธ์š”,

JUnit Custom Runners์˜ ๊ฐœ๋…์— ์ต์ˆ™ํ•ด์ง€๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์œ ํ˜•์˜ "์ปค์Šคํ…€ ๋Ÿฌ๋„ˆ"๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ,
๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค ๋ชจ๋‘๋Š” ๋™์ผํ•œ ์˜ˆ์™ธ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ๋‚˜๋Š” ๋„ˆ๋ฌด ์–ด๋ฆฌ์„์–ด์„œ ๊ทธ ์ด์œ ๋ฅผ ์•Œ์•„๋‚ด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

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

"์ปค์Šคํ…€ ๋Ÿฌ๋„ˆ" ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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);
        }
    }
}

๋‚˜๋Š” ๋˜ํ•œ BlockJUnit4ClassRunner ์—์„œ ํ™•์žฅํ•˜์—ฌ ํ–‰์šด์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„๋ฌด ์†Œ์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค.

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;
    }
}

Test-Class BestPracticesForUsingJUnit_OwnRunner2 -> Run As -> JUnit Test๋ฅผ "์˜ค๋ฅธ์ชฝ ํด๋ฆญ"ํ•˜์—ฌ Eclipse ๋‚ด์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ๊ฐ์˜ ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ์Šคํƒ ์ถ”์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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)

์ด์ƒํ•œ ์ ์€ ๋ฏธ๋ฆฌ ๊ตฌํ˜„๋œ Parameter.class -JUnit-Test-Runner๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ญ๊ฐ€ ์ž˜๋ชป ๋˜์—ˆ ๋‹ˆ?

๊ทธ๊ฒƒ์€ ์ผ์‹๊ณผ ํ•จ๊ป˜ ๋ญ”๊ฐ€?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ „ํ˜€ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”!

๋ชจ๋“  3 ๋Œ“๊ธ€

๋Ÿฌ๋„ˆ ํด๋ž˜์Šค๋Š” public ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ‹ฐ์ผ“์„ ์—ด์–ด์„œ ์ด๋Ÿฐ ์‚ฌ์†Œํ•œ ์ผ๋กœ ๊ท€์ฐฎ๊ฒŒ ํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

๋น„๊ณต๊ฐœ ํ‹ฐ์ผ“ ์„น์…˜์— ์žˆ์„ ๊ฐ€์น˜์กฐ์ฐจ ์—†๋Š” ์ด ํ‹ฐ์ผ“์ด JUnit-Github ์ €์žฅ์†Œ์˜ ๊นŠ์ˆ™ํ•œ ๊ณณ์—์„œ ์‚ฌ๋ผ์ง€๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ „ํ˜€ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰