Тестирование SpringBoot RestController с использованием @WebMvcTest и Mockito BDDMockito - PullRequest
0 голосов
/ 04 февраля 2020

Я довольно новичок в тестировании, и недавно я столкнулся с чем-то странным, а может и не странным, для инициированного.

Версия 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, это работает !!!

1 Ответ

0 голосов
/ 04 февраля 2020

Попробуйте это:

when(service.methodName(any(ObjectDto.class)).thenReturn(true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...