Здесь я тестирую свою конечную точку, используя WebMvcTest
, MockMvc
, и службу имитации, используя @MockBean
. Без использования метода standaloneSetup
приведенный ниже код работает нормально.
public class MessageControllerTest {
@Nested
@WebMvcTest
class TestUsingMockServer {
@MockBean
MessageServiceImpl messageService;
@Autowired
MockMvc mockMvc;
@Test
public void test_to_return_id_with_message_json() throws Exception {
when(messageService.findById(anyLong())).thenAnswer(invocation -> new Message("Hello World", (Long) invocation.getArguments()[0], LocalDateTime.now()));
mockMvc.perform(get("/resources/messages/{id}", 3)
.contextPath("/resources")
.accept(MediaType.APPLICATION_JSON))
.andDo(print())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(result -> {
result.toString().contains("3");
result.toString().contains("Hello World");
});
}
@Test
public void test_to_get_the_name_passed() throws Exception {
when(messageService.getMessageByIdName(anyLong(), anyString())).thenAnswer(invocation -> new Message("Hello " + invocation.getArguments()[1],
(Long) invocation.getArguments()[0], LocalDateTime.now()));
mockMvc.perform(get("/resources/messages/{id}", 3)
.queryParam("name", "kaustubh")
.contextPath("/resources")
.accept(MediaType.APPLICATION_JSON))
.andDo(print())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(result -> {
result.toString().contains("3");
result.toString().contains("kaustubh");
});
}
}
}
Чтобы избежать повторения при добавлении метода standaloneSetup
и выполнении тестов, я получаю сообщение об ошибке, в котором говорится, что компонент MessageServiceImpl не инициализирован (поскольку из NullPointerException
)
public class MessageControllerTest {
@Nested
@WebMvcTest
class TestUsingMockServer {
@MockBean
MessageServiceImpl messageService;
@Autowired
MockMvc mockMvc;
@BeforeEach
public void setUp(){
mockMvc = standaloneSetup(new MessageController())
.defaultRequest(get("/")
.contextPath("/resources")
.accept(MediaType.APPLICATION_JSON)
).build();
}
@Test
public void test_to_return_id_with_message_json() throws Exception {
when(messageService.findById(anyLong())).thenAnswer(invocation -> new Message("Hello World", (Long) invocation.getArguments()[0], LocalDateTime.now()));
mockMvc.perform(get("/resources/messages/{id}",3))
.andDo(print())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(result -> {
result.toString().contains("3");
result.toString().contains("Hello World");
});
}
}
}
Выдает следующую ошибку
Строка 17, как указано, в ошибке вызывает MessageServiceImpl
@RestController
@RequestMapping("/messages")
public class MessageController {
@Autowired
MessageServiceImpl messageService;
@GetMapping(path = "/{id}")
public Message getMessageById(@PathVariable Long id) {
return messageService.findById(id); // LINE 17
}
@GetMapping(path = "/{id}", params = "name")
public Message getMessageByIdName(@PathVariable Long id, @RequestParam(value = "name", defaultValue = "ST") String name) {
return messageService.getMessageByIdName(id, name);
}
}
Происходит потому, что построитель MockMvc
настроен до создания компонента службы?