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