当它是一个匿名类时,Junit 不启动测试用例

Posted

技术标签:

【中文标题】当它是一个匿名类时,Junit 不启动测试用例【英文标题】:Junit not launching test case when it is an anonymous class 【发布时间】:2016-06-23 15:27:42 【问题描述】:

我正在尝试使用 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 没有运行我的匿名类。基本上 main 方法在没有任何断言或日志记录的情况下退出。因此根本不调用 TestCase testFunc() 方法。

但是,当我将 TestCase 实例更改为非匿名时,一切都按预期工作并且测试用例成功:

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 类?

【问题讨论】:

【参考方案1】:

如果您在运行测试之前添加侦听器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无法执行匿名类代表的测试用例。

【讨论】:

谢谢你说得有道理。我决定通过使用命令行中的 java 属性来采用不同的方法。

以上是关于当它是一个匿名类时,Junit 不启动测试用例的主要内容,如果未能解决你的问题,请参考以下文章

使用放心的junit测试用例拒绝连接

如何使用junit和mockito为私有void方法编写测试用例[重复]

在Spring Boot Junit测试用例中使用contextLoads方法有什么用?

在Maven项目中运行JUnit 5测试用例

Spring—— Junit框架单元测试

测试类时,使用 Junit 和 Mockito 检查方法内部的工作