我试图使用JUnit进行功能测试。基本上我这样做是为了能够访问JUnit报告。不幸的是,当我尝试从main方法启动JUnit时遇到了问题。
基本上我正在开发一个功能测试工具,用户可以从命令行提供测试文件名作为参数。我在下面简化了一下:
import org.junit.runner.JUnitCore;
public class MainClass {
public static void main(String[] args) throws Exception {
TestCase testCase = new TestCase() {
@Override
public String getPath() {
return args[0];
}
};
JUnitCore junit = new JUnitCore();
junit.run(testCase.getClass());
}
}
然后,TestCase类对提供的参数起作用并提供输出:
import org.junit.Assert;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestCase {
private static final Logger LOGGER = LoggerFactory.getLogger(TestCase.class);
public String getPath() {
return "etc/Default.flow";
}
@Test
public void testFunc() {
try {
LOGGER.info("Entered testFunc()");
Launcher launcher = new Launcher(getPath());
launcher.launch();
launcher.awaitCompletion();
Assert.assertTrue(launcher.getStatus());
LOGGER.info("Success");
} catch (AssertionError e) {
LOGGER.error("Assertion error", e);
}
}
因此,从上面可以看出,Launcher实例将根据在命令行输入的内容以不同的文件名启动。
然而问题是Junit没有运行我的匿名类。基本上,主方法退出时不会发生任何断言或记录。因此,根本不调用TestCase testFunc()方法。
但是,当我将TestCase实例更改为不是匿名时,everthing按预期工作并且测试用例成功:
import org.junit.runner.JUnitCore;
public class MainClass {
public static void main(String[] args) throws Exception {
TestCase testCase = new TestCase();
JUnitCore junit = new JUnitCore();
junit.run(testCase.getClass());
}
}
为什么JUnit只有在匿名时才会启动Test类?
答案 0 :(得分:2)
如果在运行测试之前添加了监听器junit.addListener(new TextListener(System.out));
,您将看到如下内容:
There were 2 failures:
1) initializationError(junit.MainClass$1)
java.lang.Exception: The class junit.MainClass$1 is not public.
...
2) initializationError(junit.MainClass$1)
java.lang.Exception: Test class should have exactly one public constructor
at org.junit.runners.BlockJUnit4ClassRunner.validateOnlyOneConstructor(BlockJUnit4ClassRunner.java:158)
at org.junit.runners.BlockJUnit4ClassRunner.validateConstructor(BlockJUnit4ClassRunner.java:147)
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:127)
at org.junit.runners.ParentRunner.validate(ParentRunner.java:416)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:84)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65)
这意味着JUnit无法执行由匿名类表示的测试用例。