【问题标题】:Unable to run unit test cases无法运行单元测试用例
【发布时间】:2020-05-26 13:50:15
【问题描述】:

我正在使用 Junit5 为我的项目编写测试用例,当我运行一个测试用例时,所有测试用例都通过了,但其中一些在控制台中给了我以下错误

WARNING: TestEngine with ID 'junit-jupiter' failed to execute tests
java.lang.NoClassDefFoundError: junit/framework/ComparisonFailure
    at org.eclipse.jdt.internal.junit5.runner.JUnit5TestListener.getFailedComparison(JUnit5TestListener.java:133)
    at org.eclipse.jdt.internal.junit5.runner.JUnit5TestListener.notifyIfNotSuccessful(JUnit5TestListener.java:89)
    at org.eclipse.jdt.internal.junit5.runner.JUnit5TestListener.executionFinished(JUnit5TestListener.java:71)
    at org.junit.platform.launcher.core.TestExecutionListenerRegistry$CompositeTestExecutionListener.lambda$executionFinished$3(TestExecutionListenerRegistry.java:77)
    at java.util.ArrayList.forEach(Unknown Source)
    at org.junit.platform.launcher.core.TestExecutionListenerRegistry.notifyTestExecutionListeners(TestExecutionListenerRegistry.java:51)
    at org.junit.platform.launcher.core.TestExecutionListenerRegistry.access$100(TestExecutionListenerRegistry.java:27)
    at org.junit.platform.launcher.core.TestExecutionListenerRegistry$CompositeTestExecutionListener.executionFinished(TestExecutionListenerRegistry.java:77)
    at org.junit.platform.launcher.core.ExecutionListenerAdapter.executionFinished(ExecutionListenerAdapter.java:56)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.reportCompletion(NodeTestTask.java:138)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:79)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
    at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:89)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

例如

Mockito.verify(exportFile, Mockito.times(1)).exportCsvFile(Mockito.anyList(), Mockito.anyString());
Mockito.verify(exportFile, Mockito.times(2)).exportCsvFile(Mockito.anyList(), Mockito.anyString());
Mockito.verify(exportFile, Mockito.times(3)).exportCsvFile(Mockito.anyList(), Mockito.anyString();

每次测试用例通过,但对于第二个和第三个案例,我看到的是java.lang.NoClassDefFoundError: junit/framework/ComparisonFailure
下面是我的 pom 的样子:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <!-- exclude junit 4 -->
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- junit 5 -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <scope>test</scope>
        </dependency>

下面是我的测试类的样子(提供了类的必要部分)。

public class AccountServiceTest {
    AccountService AccountService;
    @Mock
    ExportFile exportFile;

    @BeforeEach
    public void init() {
        MockitoAnnotations.initMocks(this);
        accountService = new AccountService(exportFile);
    }
    @Test
    public void testFileExport() {
        accountService.process(partner.getName());
        Mockito.verify(exportFile).exportCsvFile(Mockito.anyList(), Mockito.anyString());
    }
}

【问题讨论】:

  • 首先,您在项目中需要的唯一依赖项是 spring-boot-starter-test,因为它将为您带来 JUnit 5(包括 JUnit 4)、Mockito、AssertJ 等...请提供您的课堂测试
  • @Fabien 我的 spring-boot-starter-test 版本是 2.1.6.RELEASE,当我删除其他依赖项时无法找到 @Test@BeforeEach

标签: java spring-boot junit5 junit-jupiter


【解决方案1】:

如果您可以将 spring-boot-starter-test 升级到至少2.2.0.RELEASE,它将为您带来 JUnit 5(如果您想同时运行 JUnit4 和 JUnit5 测试,也不需要排除)。仅使用 Spring Boot 启动器依赖项是处理依赖项之间不兼容版本问题的好方法,因为 Spring Boot 会为您管理。

如果你想用 JUnit5 和 Mockito 运行测试,你的类应该看起来像这样(你想测试的对象用 @InjectMocks 注释,你想用 @Mock 模拟它的依赖关系,用 @987654324 进行类测试@):

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
public class AccountServiceTest {

    @Mock
    ExportFile exportFile;

    @InjectMocks
    AccountService accountService;

    @Test
    public void testFileExport() {
        accountService.process("");
        Mockito.verify(exportFile).exportCsvFile(Mockito.anyList(), Mockito.anyString());
    }
}

【讨论】:

  • 感谢@Fabien,您的回答在某种程度上帮助我解决了这个问题。对我来说,删除排除部分解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多