Я пишу юнит-тест для контроллера моего приложения с весенней загрузкой.
У меня есть типичные классы 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 возвращает ноль
Я убедился, что входные объекты как моего фактического контроллера, так и объекта, который я передаю в случае устройства, являются экземплярами одного и того же класса.