spring - Mockito 在 Spring 测试类 @BeforeAll 方法中抛出 NPE
问题描述
我正在尝试使用 Mockito 模拟服务并在 @BeforeAll 方法中设置所有方法调用。代码如下:
@SpringBootTest
@AutoConfigureMockMvc(addFilters = false)
public class VirtualMachineServiceIntegrationTests {
@MockBean
static VirtualMachineService virtualMachineService;
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
static String courseId;
static String studentId;
static Long teamId;
static Long vmId;
static SystemImage os;
static VirtualMachineDTO virtualMachineDTO;
static ConfigurationDTO configurationDTO;
@BeforeAll
static void beforeAll() {
studentId = "student";
courseId = "course";
teamId = 1L;
vmId = 1L;
os = SystemImage.WINDOWS_10;
virtualMachineDTO = VirtualMachineDTO.builder()
.id(1L)
.num_vcpu(2)
.disk_space(1000)
.ram(4)
.status(VirtualMachineStatus.OFF)
.build();
configurationDTO = ConfigurationDTO.builder()
.id(1L)
.min_vcpu(2)
.min_disk(1000)
.min_ram(4)
.max_vcpu(12)
.max_disk(2000)
.max_ram(16)
.max_on(4)
.tot(20)
.build();
Mockito.when(Mockito.any(VirtualMachineService.class).createVirtualMachine(Mockito.anyString(), Mockito.anyLong(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt())).thenReturn(virtualMachineDTO);
}
}
thenReturn
即使没有该方法,Mockito 也会抛出 NPE 。如果我移动这条线
Mockito.when(Mockito.any(VirtualMachineService.class).createVirtualMachine(Mockito.anyString(), Mockito.anyLong(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt())).thenReturn(virtualMachineDTO);
然后在 @Test 方法中,在抛出 NPE 后,它将输出:
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Misplaced or misused argument matcher detected here:
-> at it.polito.ai.backend.VirtualMachineServiceIntegrationTests.createVirtualMachine(VirtualMachineServiceIntegrationTests.java:87)
-> at it.polito.ai.backend.VirtualMachineServiceIntegrationTests.createVirtualMachine(VirtualMachineServiceIntegrationTests.java:87)
-> at it.polito.ai.backend.VirtualMachineServiceIntegrationTests.createVirtualMachine(VirtualMachineServiceIntegrationTests.java:87)
-> at it.polito.ai.backend.VirtualMachineServiceIntegrationTests.createVirtualMachine(VirtualMachineServiceIntegrationTests.java:87)
-> at it.polito.ai.backend.VirtualMachineServiceIntegrationTests.createVirtualMachine(VirtualMachineServiceIntegrationTests.java:87)
-> at it.polito.ai.backend.VirtualMachineServiceIntegrationTests.createVirtualMachine(VirtualMachineServiceIntegrationTests.java:87)
-> at it.polito.ai.backend.VirtualMachineServiceIntegrationTests.createVirtualMachine(VirtualMachineServiceIntegrationTests.java:87)
You cannot use argument matchers outside of verification or stubbing.
Examples of correct usage of argument matchers:
when(mock.get(anyInt())).thenReturn(null);
doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());
verify(mock).someMethod(contains("foo"))
This message may appear after an NullPointerException if the last matcher is returning an object
like any() but the stubbed method signature expect a primitive argument, in this case,
use primitive alternatives.
when(mock.get(any())); // bad use, will raise NPE
when(mock.get(anyInt())); // correct usage use
Also, this error might show up because you use argument matchers with methods that cannot be mocked.
Following methods *cannot* be stubbed/verified: final/private/equals()/hashCode().
Mocking methods declared on non-public parent classes is not supported.
我是 Spring 测试和 Mockito 的新手,所以我无法弄清楚我做错了什么。任何帮助表示赞赏,谢谢。
解决方案
这里有很多东西有点奇怪。主要/误解问题是:
Mockito#when 用于告诉具体的模拟在特定方法调用上要做什么。所以通常它是这样的:
Mockito.when(mock.doSomeThings(anyString()).thenReturn("whatever");
将此模式应用于您的代码,这应该可以解决问题:
Mockito.when(virtualMachineService.createVirtualMachine(Mockito.anyString(), Mockito.anyLong(), Mockito.anyString(), Mockito.any Int(), Mockito.anyInt(), Mockito.anyInt())).thenReturn(virtualMachineDTO);
除此之外,您将所有内容都声明为静态看起来很奇怪。我将从所有类成员中删除静态并更改@BeforeAll
为@Before
或@BeforeEach
(取决于您使用 JUnit 4 还是 5)。
推荐阅读
- python - 在 IPython 中检测哪个 CMD/终端调用用于启动 IPython
- json - 在 jq 输出中将 12h 时间值格式化为 24h
- c - stm32f051r8t6 TIM14 中断处理程序在复位后不工作
- javascript - Electron desktop app Icon is not displaying?
- web-services - Extract SOAP custom header information
- scala - How to get the globally declared MapState value in RichCoMapFunction [ Apache Flink ]?
- c# - c# 替代枚举以获得智能感知优势
- javascript - HTML5 画布保存实际大小的图像
- python - 如何从 dtype=object 制作表格或 DataFrame?
- java - Google App Engine Java Hibernate - SQL 连接超时