【问题标题】:Run JUnit Jupiter test with Spring 4.1 and JUnit4 Runner in IntelliJ在 IntelliJ 中使用 Spring 4.1 和 JUnit4 Runner 运行 JUnit Jupiter 测试
【发布时间】:2019-06-06 06:31:34
【问题描述】:

以下是我的目标

  • 为 4.1.6.RELEASE 版本的 Spring 代码编写 Jupiter 测试用例 [Junit5 中的测试用例]。

我选择了以下操作 [因为 Junit5 支持在 Junit4 runner 上运行 Jupiter 测试]:

  • 编写一个 Jupiter 测试用例 [Junit5 中的测试用例]
  • 使用 Junit4 Runner [在 IntelliJ IDE 中] 运行

IDE 和代码版本详情

  • 春季版:4.1.6.RELEASE
  • Java 版本:1.8 [Java 8]
  • IDE:IntelliJ 社区 2018.3

我面临的问题

  • 当我在 IntelliJ IDE 中运行 jupiter 测试用例时: 我看到测试用例是由 junit5 运行的。 [IntelliJ 跟踪显示:“com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit5”] 结果,预期的对象没有在我的测试类中自动装配/注入。

我已将 junit4junit5 从代码添加到类路径。

有人可以建议如何将 intellij 配置为每次运行测试时只使用 junit4 runner。

要测试的类

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Repository
public class MyClassImpl implements IMyClass {

@PersistenceContext
private EntityManager entityManager;

@Override
public String getName(Long Id) {
    String queryString = "some query string";
    Query query = entityManager.createNativeQuery(queryString);
    List<String> resultList = query.getResultList();
    return resultList.isEmpty() ? null : resultList.get(0);
}

单元测试代码:TestClass 测试 MyClassImpl 类

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;

@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {EnvironmentConfig.class, DataConfig.class, WebConfig.class})
@ActiveProfiles("dev")
class MyClassImplTest {

    @Autowired
    private IMyClass myClassObj;

     @Test
    void getAssessmentNameTestIT() 
    {
        if (myClassObj == null)
            System.out.println(" ************ I am NULL ************");
        else {
            System.out.println(" ************ I am NOT NULL ************");
            myClassObj.getName(21L);
        }
    }
}

注意:如果我只使用 Junit 4 [不使用任何 junit5 库] 编写相同的测试用例,则会注入预期的对象。

Maven 依赖项

  • junit-jupiter-api 发布
  • junit-jupiter-engine 发布
  • junit-platform-runner 1.2.0
  • junit 4.10 [测试]

Maven 插件:

<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
<dependencies>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-surefire-provider</artifactId>
        <version>1.3.2</version>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>RELEASE</version>
    </dependency>
</dependencies>

提前致谢

【问题讨论】:

    标签: intellij-idea junit junit5


    【解决方案1】:

    @RunWith(SpringJUnit4ClassRunner.class) 仅适用于 JUnit 4,因此类名中包含“JUnit4”。

    因此,如果您使用的是 JUnit 4 Runner,则不能使用来自 JUnit 5 (JUnit Jupiter) 的注释——例如 org.junit.jupiter.api.Test。那永远都行不通。

    要将 Spring 的测试支持与 JUnit Jupiter 一起使用,您必须使用 SpringExtension 而不是 SpringJUnit4ClassRunnerSpringRunner -- 像这样:@ExtendWith(SpringExtension.class)

    自 Spring Framework 5.0 起,SpringExtension 作为 spring-test 工件的一部分得到官方支持:https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#testcontext-junit-jupiter-extension

    请注意,如果您从我的 GitHub 存储库中使用 SpringExtension 的原始版本,则可以将其与 Spring Framework 4.3.x 一起使用:https://github.com/sbrannen/spring-test-junit5

    在您的情况下,如果您仍在使用 Spring Framework 4.1.6.RELEASE,则无法将 Spring 的测试支持与 JUnit 5 一起使用。您需要至少升级到 Spring Framework 4.3.x,或者最好升级到 Spring Framework 5.1.x。

    问候,

    Sam(Spring TestContext 框架的作者

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-20
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      相关资源
      最近更新 更多