Я довольно новичок в тестировании, и недавно я столкнулся с чем-то странным, а может и не странным, для инициированного.
Версия SpringBoot: 2.2.4.RELEASE
Ядро Mockito: 3.1.0
Вариант использования: Тест RestController с использованием среза @WebMvcTest, MockBean, Mock Mvc & BDDMockito:
@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)...
И мой контроллер:
@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)
, но было бы здорово понять, почему // задано (service.methodName (objectDto)). WillReturn (true); не работает.
Это потому, что, поскольку я издеваюсь над методом обслуживания, Mockito не заботится о том, какой объект передается в методе?
ПРИМЕЧАНИЕ 1. ObjectDTO - это просто POJO.
ПРИМЕЧАНИЕ 2: если objectDTO заменяется на Map
, это работает !!!