์๋ ํ์ธ์,
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๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
๋ญ๊ฐ ์๋ชป ๋์ ๋?
๊ทธ๊ฒ์ ์ผ์๊ณผ ํจ๊ป ๋ญ๊ฐ?
๋ฌ๋ ํด๋์ค๋ public
์ด์ด์ผ ํฉ๋๋ค.
ํฐ์ผ์ ์ด์ด์ ์ด๋ฐ ์ฌ์ํ ์ผ๋ก ๊ท์ฐฎ๊ฒ ํด์ ์ฃ์กํฉ๋๋ค.
๋น๊ณต๊ฐ ํฐ์ผ ์น์ ์ ์์ ๊ฐ์น์กฐ์ฐจ ์๋ ์ด ํฐ์ผ์ด JUnit-Github ์ ์ฅ์์ ๊น์ํ ๊ณณ์์ ์ฌ๋ผ์ง๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ ํ ๊ฑฑ์ ํ์ง ๋ง์ธ์!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ํ ๊ฑฑ์ ํ์ง ๋ง์ธ์!