微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在@BeforeAll 注释方法中使用 JUnit 5 运行的测试中,Mockito 不会初始化模拟

如何解决在@BeforeAll 注释方法中使用 JUnit 5 运行的测试中,Mockito 不会初始化模拟

Mockito 不会在 @BeforeAll 注释方法中使用 JUnit 5 初始化模拟运行。 如果我将 init 方法注释更改为 @BeforeEach,它会起作用。测试在 IntelliJ IDEA 中运行。

我的测试班:

@ExtendWith(MockitoExtension.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class MyTest {
    
    private MyMockedClass myMockedClass;

    @BeforeAll
    public void init() {
        when(myMockedClass.getSomething()).thenReturn(something); // Mock is not initialized,getting NPE on test

依赖项(仅显示相关的,为简洁起见省略其他):

[INFO] --- maven-dependency-plugin:2.10:tree (default-cli) @ XXX ---
[INFO] +- org.mockito:mockito-core:jar:3.6.28:test
[INFO] |  +- net.bytebuddy:byte-buddy:jar:1.10.18:compile
[INFO] |  +- net.bytebuddy:byte-buddy-agent:jar:1.10.18:test
[INFO] |  \- org.objenesis:objenesis:jar:3.1:test
[INFO] +- org.mockito:mockito-junit-jupiter:jar:3.6.28:test
[INFO] |  \- org.junit.jupiter:junit-jupiter-api:jar:5.7.0:test
[INFO] |     +- org.apiguardian:apiguardian-api:jar:1.1.0:test
[INFO] |     +- org.opentest4j:opentest4j:jar:1.2.0:test
[INFO] |     \- org.junit.platform:junit-platform-commons:jar:1.7.0:test
[INFO] +- org.springframework.boot:spring-boot-starter-test:jar:2.4.1:test
[INFO] |  +- org.junit.jupiter:junit-jupiter:jar:5.7.0:test
[INFO] |  |  +- org.junit.jupiter:junit-jupiter-params:jar:5.7.0:test
[INFO] |  |  \- org.junit.jupiter:junit-jupiter-engine:jar:5.7.0:test
[INFO] |  |     \- org.junit.platform:junit-platform-engine:jar:1.7.0:test

解决方法

MockitoExtension 类实现了 JUnit-Jupiter-API 中的 BeforeEachCallback,但没有实现 BeforeAllCallback。因此,它不会为 @BeforeAll 带注释的方法提供任何额外的行为。

MockitoExtension 的源代码摘录

public class MockitoExtension implements BeforeEachCallback,AfterEachCallback,ParameterResolver {
,

您缺少 myMockedClass 的初始化。请注意,您不能为其使用 @Mock 注释,因为 @BeforeAll 方法将在该注释用于初始化模拟对象之前运行,并且您必须求助于显式调用 { {1}}:

Mockito.mcok

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。