如何用Mockito模拟控制器参数方法



我有以下控制器方法,其中criterias是一个带有查询参数的对象构建:

@GetMapping
public List<Employee> findAll(CustomCriteria criterias) {
// this method build a custom mongoDB query object
final Query query = criterias.buildMongoDBQueryFromCriteria();
return employeeService.find(query);
}

测试内容如下:

@Test
void get_all_employees_with_criterias() {
given(employeeService.find(any(Query.class)))
.willReturn(List.of(new Employee(), new Employee));
final var responseBody = mvc.perform(get("/employees?companyId=12,14")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andReturn()
.getResponse().getContentAsString();
assertThatJson(responseBody).isArray().size().isEqualTo(2);
}

我找不到如何嘲笑criterias.buildMongoDBQueryFromCriteria()。事实上,这个方法中有很多逻辑,我不希望它被@WebMvcTest真正调用。

我已经尝试在控制器测试类中使用@Spy注释,但它似乎不起作用:/

我很确定它一定是非常基本的,但我在谷歌上没有发现任何类似的需求。

感谢您的帮助

编辑

根据@nnhthuan的回复,我更新了我的测试如下,但它仍然不起作用:

@Test
void get_all_employees_with_criterias() {
var customCriteriaMock = Mockito.mock(CustomCriteria.class);
var mockedQuery = Mockito.mock(Query.class);


when(customCriteriaMock.buildMongoDBQueryFromCriteria()).thenReturn(mockedQuery);
given(employeeService.find(mockedQuery))
.willReturn(List.of(new Employee(), new Employee()));
final var responseBody = mvc.perform(get("/employees?companyId=12,14")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andReturn()
.getResponse().getContentAsString();
assertThatJson(responseBody).isArray().size().isEqualTo(2);
}

如果你在问如何编写单元测试,这就是如何编写的,而不是你上面试图编写的。

@Test
public void testFindAll() {
CustomCriteria mockCriteria = Mockito.mock(CustomCriteria.class);
Query mockQuery = Mockito.mock(Query.class);
List<Employee> expectation = new ArrayList<>();
when(mockCriteria.buildMongoDBQueryFromCriteria()).thenReturn(mockQuery);
when(employeeService.find(mockQuery)).thenReturn(expectaion)

List<Employee> actual = controller.findAll(mockCriteria);
assertThat(actual).sameInstance(expectation); // Or whatever framework you are using to assert.
}

如果您正在询问如何使用实际服务编写集成测试,那么不要使用mocking框架。:(

相关内容

  • 没有找到相关文章

最新更新