gpt4 book ai didi

java - 使用 @WebMvcTest 和 Mockito BDDMockito 测试 SpringBoot RestController

转载 作者:行者123 更新时间:2023-12-01 18:35:45 27 4
gpt4 key购买 nike

我对测试很陌生,最近我遇到了一些奇怪的事情,或者对于初学者来说可能并不奇怪。

SpringBoot版本:2.2.4.RELEASE
Mockito 核心:3.1.0

用例:使用 @WebMvcTest 切片、MockBean、MockMvc 和 BDDMockito 进行 RestController 测试:

@WebMvcTest(Controller.class)
@AutoConfigureMockMvc(addFilters = false)
public class ControllerTest {

@Autowired
private MockMvc mockMvc;

@MockBean
private Service service;

@Test
@DisplayName("Some meaningful name")
public void getXXXShouldBeSuccessful() throws Exception {
...
//NOTE: I know creating objectDto here is useless, but i would like to understand
//why it doesn't work when it is passed in the method
//ObjectDto objectDto = new ObjectDto();
//objectDto.someSetter(id);
...
given(service.methodName((ObjectDto) any(Object.class))).willReturn(true); // This works
//given(service.methodName(objectDto)).willReturn(true); //This doesn't work

this.mockMvc.perform(post(some endpoint)...

还有我的 Controller :

    @PostMapping(value = "/{id}")
public ResponseEntity<JsonResponse> someMethod(
@PathVariable String id,
@Valid @RequestBody ObjectDto objectDto) {

objectDto.someSetter(id);

if(service.methodName(objectDto)) // <============ Returns false
//Expected true, but if(service.methodName(objectDto)) is false when testing,
//although both objectDto(in my test, and here in the
//controller, has the same exact property values)

我通过使用 (ObjectDto) any(Object.class) 找到了解决方案,但很高兴理解为什么 //given(service.methodName(objectDto)).willReturn (true); 不起作用。

是不是因为我在模拟服务方法,Mockito 不关心方法中传递的对象是什么?

注1:objectDTO 只是一个 POJO。
注意 2:如果将 objectDTO 替换为 Map,它就可以工作!!!

最佳答案

试试这个:

when(service.methodName(any(ObjectDto.class)).thenReturn(true);

关于java - 使用 @WebMvcTest 和 Mockito BDDMockito 测试 SpringBoot RestController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60050815/

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