Spring boot Unit test с @WebMvcTest - выполнение не входит в уровень обслуживания из контроллера и возвращает ноль без ошибок - PullRequest
0 голосов
/ 29 марта 2019

Я пишу юнит-тест для контроллера моего приложения с весенней загрузкой. У меня есть типичные классы MVC: ObjectSchemaController, ObjectSchemaService и ObjectSchemaDao. Я написал модульный тест с @WebMvcTest и издевался над своим сервисом и классом dao с @MockBean. (следуя этому руководству: https://www.baeldung.com/spring-boot-testing)

Ниже приведен мой модульный тест:

@RunWith(SpringRunner.class)
@WebMvcTest(ObjectSchemaController.class)
public class ObjectSchemaControllerTest2 {
    @Autowired
    private MockMvc mvc;
    @MockBean
    private ObjectSchemaService service;
    @MockBean
    private ObjectSchemaDao dao;
    @Autowired
    ObjectMapper objectMapper;
    @Test
    public void testCreateObjectSchemaPass() throws Exception {
        String payload = "{\"some_key\":\"some val\"}";
        ObjectSchema objectSchema = objectMapper.readValue(payload, ObjectSchema.class);

        Mockito.when(service.createSchema(objectSchema))
        .thenReturn(objectSchema);
        Mockito.when(dao.createSchema(objectSchema)).thenReturn(objectSchema);

        mvc.perform(MockMvcRequestBuilders.post("/objectservice/schema/")
       .contentType("application/json")
       .content(objectMapper.writeValueAsString(objectSchema)))
       .andExpect(status().isOk());
    }

}

ниже мой класс обслуживания:

@Service
public class ObjectSchemaService {
    @Autowired
    ObjectSchemaDao objectSchemaDao;

    public ObjectSchema createSchema(@Valid ObjectSchema objectSchema)throws Exception {
        return objectSchemaDao.createSchema(objectSchema);
    }
}

Проблема, с которой я сталкиваюсь при модульном тесте, заключается в том, что сервисный уровень не выполняется и возвращает нулевое значение.

Когда я отлаживаю, я вижу, что выполнение достигает в моем классе контроллера и ObjectSchemaService как mockito-mocked в контроллере. Но выполнение никогда не идет на уровне службы, и значение, возвращаемое методом службы, равно нулю.

Я ссылался на других гидов - они делают аналогичные шаги. Но это не работает для меня. Что мне здесь не хватает?

Я также видел этот пост с похожей проблемой.

POST модульного теста с @WebMvcTest - служба @MockBean возвращает ноль

Я убедился, что входные объекты как моего фактического контроллера, так и объекта, который я передаю в случае устройства, являются экземплярами одного и того же класса.

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Вы издеваетесь над ObjectSchemaService, поэтому вам нужно сообщить службе, как имитировать значения из службы при вызове метода. Если вы не издеваетесь над значениями сервиса, Mockito не знает, что они должны вернуть, всегда дает вам ноль. Не нужно издеваться над ObjectSchemaDao в этом тесте.

Примечание: я использую Lombok в коде как ObjectSchema.builder () для возврата объекта с идентификатором, когда он хранится в базе данных, вы можете использовать конструктор. Предполагая, что служба вернет объект.

Код выглядит так:

import static org.mockito.BDDMockito.given;

@Test
public void testCreateObjectSchemaPass() throws Exception {
        String payload = "{\"some_key\":\"some val\"}";
        ObjectSchema objectSchema = objectMapper.readValue(payload, ObjectSchema.class);
        given(service.createSchema(objectSchema)).willReturn(
                ObjectSchema.builder()
                        .id(1)
                        .someKey("Some Val")
                        .build());
        mvc.perform(MockMvcRequestBuilders.post("/objectservice/schema/").contentType("application/json").content(objectMapper.writeValueAsString(objectSchema)))
                .andExpect(status().isOk());
    }
0 голосов
/ 29 марта 2019

Вы издеваетесь над ObjectSchemaService, но поведение не ожидается. Вам нужно настроить поведение для сервисов, которые будут проверены. Так что в зависимости от сигнатуры метода и результата что-то типа.

Mockito.when(service.createSchema(Mockito.any(ObjectSchema.class)).thenReturn(objectSchema);

В настоящий момент макет ObjectSchemaService просто возвращает значение по умолчанию , которое в вашем случае является нулевым.

Чтобы быть прозрачными и ненавязчивыми, все mockito mocks по умолчанию возвращают 'nice' значения. Например: нули, ложные значения, пустые коллекции или нули.

Если вы обновите свой ответ с подробной информацией для ObjectSchemaService, я также мог бы обновить свой ответ.

...