gpt4 book ai didi

java - 使用来自 mockito-junit-jupiter 的 MockitoExtension 在构造函数测试类中进行空模拟

转载 作者:行者123 更新时间:2023-11-30 07:45:35 30 4
gpt4 key购买 nike

通过使用 mockito-junit-jupiter@MockitoExtension 扩展,模拟在测试类构造函数中为 null。

使用的依赖:

mockito-junit-jupiter:2.18.0
单元-jupiter-api:5.1.1

我们可以仅使用模拟字段重现该问题,但被测对象构造函数对模拟的使用很好地说明了典型场景:

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

@ExtendWith(MockitoExtension.class)
public class FooTest {

@Mock
Bar mockBar;
Foo foo;

public FooTest() {
foo = new Foo(mockBar); // mockBar is null here
}

@Test
public void doThis() {
Mockito.when(mockBar.doThat())
.thenReturn(Mockito.anyInt());
// ...
}

}

因此,模拟对象四处走动,但未与被测对象 Foo 相关联。
为什么 ?使用什么解决方法?

最佳答案

解决方案 1:

@InjectMocks替换构造函数初始化:

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

@ExtendWith(MockitoExtension.class)
public class FooTest {

@Mock
Bar mockBar;

@InjectMocks
Foo foo;

@Test
public void doThis() {
Mockito.when(mockBar.doThat())
.thenReturn(Mockito.anyInt());
// ...
}

}

这可行,但使用 @InjectMocks 也是一个品味问题,因为如果所有注入(inject)策略都失败,那么 Mockito 不会报告失败。
这种不需要的注入(inject)可能会让你烦恼。如果是这种情况,您可以使用下一种方法。

解决方案 2:

@BeforeEach 注释的方法替换构造函数初始化:

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

@ExtendWith(MockitoExtension.class)
public class FooTest {

@Mock
Bar mockBar;
Foo foo;

@BeforeEach
public void beforEach() {
foo = new Foo(mockBar);
}

@Test
public void doThis() {
Mockito.when(mockBar.doThat())
.thenReturn(Mockito.anyInt());
// ...
}

}

关于java - 使用来自 mockito-junit-jupiter 的 MockitoExtension 在构造函数测试类中进行空模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51658235/

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