在 IntelliJ 中使用 Spring 4.1 和 JUnit4 Runner 运行 JUnit Jupiter 测试

Siv*_*iva 2 junit intellij-idea junit5

以下是我的目标

  • 为 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);
}
Run Code Online (Sandbox Code Playgroud)

单元测试代码: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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Maven 依赖项

  • junit-jupiter-api 发布
  • junit-jupiter-engine 发布
  • junit 平台运行器 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>
Run Code Online (Sandbox Code Playgroud)

提前致谢

Sam*_*nen 7

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

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

使用Spring的使用JUnit测试木星的支持,你必须使用SpringExtension的,而不是SpringJUnit4ClassRunnerSpringRunner-这样的:@ExtendWith(SpringExtension.class)

SpringExtension官方支持的一部分spring-test:因为Spring框架5.0神器https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#testcontext-junit-jupiter-extension

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

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

问候,

Sam(Spring TestContext Framework 的作者