gpt4 book ai didi

spring - Spring Boot 2 应用程序的 JUnit 5 测试中的模拟 Autowiring 依赖项

转载 作者:行者123 更新时间:2023-12-02 01:37:28 25 4
gpt4 key购买 nike

考虑下面的测试类:

public class SomeClass {

@Autowired
private SomeDependency someDependency;

public int inc(int i) {
someDependency.doSomething();
return i + 1;
}

}

如何在 Spring Boot 2 (2.0.0.1) 的 JUnit 5 (5.0.1) 测试中模拟(最好使用 Mockito)someDependency M2)应用程序?当我尝试调用 SomeClass#inc(int) 时,它会产生 NullPointerException,因为未注入(inject) Autowiring 依赖项。

最佳答案

Mockito 1 运行程序(MockitoJUnitRunner 类)并非设计用于运行 JUnit 5 测试。

所以用以下方式注释你的类:

import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class MyJUnit5Test {

不会有任何影响。

为了能够使用@Mock注释,您可以在每次测试之前调用:

 MockitoAnnotations.initMocks(this);

在用 JUnit 5 @BeforeEach 注释的方法中。
但从现在开始,不在每个 JUnit 测试类中重复此预处理的更好替代方法是使用 MockitoExtension class provided by the mockito-junit-jupiter dependency

<小时/>

代码示例

假设 SomeDependency 类声明为:

@Component
public class SomeDependency {

public String returnThat() {
return "that";
}
}

您可以在单元测试中以这种方式模拟依赖关系:

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;

import davidhxxx.example.angularsboot.SomeDependency;

@ExtendWith(MockitoExtension.class)
public class SomeClassTest {

@Mock
SomeDependency someDependencyMock;

private SomeClass someClass;

@BeforeEach
public void setup(){
someClass = new SomeClass(someDependencyMock);
}

@Test
void myFirstTest() {
Mockito.when(someDependencyMock.returnThat()).thenReturn("mock result");
Assertions.assertEquals("mock result", someClass.inc());
}

}

请注意,SomeClass 必须提供一种方法来设置其 SomeDependency 依赖项。
您应该添加一个接受以下实例的构造函数。
使用 setter 也是一种方法,同时它提供了可变性。

<小时/>

pom.xml 要求

1) 您可以添加 spring-boot-starter-test 依赖项,其中包括 Mockito 和继承依赖项中的其他有用的东西:

<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
...
</dependencies>

还添加 junit-jupiter-engine 依赖项以及您需要的所有其他可选 JUnit 5 依赖项:

<dependencies>
...
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>2.18.0</version> <!-- version to specify as not provided by Spring Boot dependencies -->
<scope>test</scope>
</dependency>
</dependencies>

您不需要指定 junit-jupiter-engine 工件的版本,但您可能需要其他 JUnit 5 依赖项,例如 junit-jupiter-params
希望在下一版本的 Spring Boot 中不再需要这样做。

2) 请注意:如果您使用拉取的 Spring Boot 版本2.20 版本的 maven-surefire-plugin 它将无法工作。因此,您必须重写 maven-surefire-plugin 插件配置来指定与 JUnit 5 兼容的版本(即 2.19 或 2.21 及更高版本)。
例如,2.0.0.M5 版本的 Spring Boot 会拉取 maven-surefire-plugin:2.20,因此需要重新配置插件,如下所示:

    <plugins>
...
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</plugin>
...
<plugins>

它将生成 Maven 警告:

Overriding managed version 2.20.1 for maven-surefire-plugin

好消息:从 Spring Boot 2.0.1.RELEASE 版本开始,此问题已得到解决,因为 maven-surefire-plugin 版本已更新为使用解决该问题的 2.21.0 及更高版本。

关于spring - Spring Boot 2 应用程序的 JUnit 5 测试中的模拟 Autowiring 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46772490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com