Spring MVC, как проверить, что мой сервис сохраняется сущности в почтовом запросе
Итак, я пишу это веб-приложение с Spring Boot, используя Spring Data с JPA и Spring MVC, и я хотел бы провести фиктивные тесты контроллера. Я выяснил, как протестировать метод get, но в моем методе поста контроллеров новая сущность JPA либо сохраняется, либо обновляется с помощью моей службы. Вот как выглядит мой контроллер:
@Controller
@RequestMapping("/registerMember")
public class RegisterMemberController {
@Autowired
private MemberService memberService;
@GetMapping
public String index(RegisterMemberBean registerMemberBean) {
return "registerMember";
}
@PostMapping
public String handleSubmit(@Valid RegisterMemberBean registerMemberBean, BindingResult bindingResult, Model model) {
Member member = registerMemberBean.getMember();
boolean isRepeatPasswordCorrect = !isRepeatPasswordIncorrect(member.getPassword(), registerMemberBean.getComparePassword());
if(isAnyErrors(isRepeatPasswordCorrect, !bindingResult.hasErrors())) {
if(!isRepeatPasswordCorrect) {
model.addAttribute("isRepeatPasswordIncorrect", true).
addAttribute("isRepeatPasswordIncorrectMsg", "Passwords don't match");
}
return "registerMember";
}
boolean errUsername = !memberService.isNoOtherEntityWithUserName(0, member.getUserName());
boolean errEmail = !memberService.isNoOtherEntityWithEmail(0, member.getEmail());
if(errUsername || errEmail) {
if(errUsername) {
model.addAttribute("isExistingUserName", true).addAttribute("isExistingUserNameMsg", "Already a user with that username");
} if(errEmail) {
model.addAttribute("isExistingEmail", true).addAttribute("isExistingEmailMsg", "Already a user with that email");
}
return "registerMember";
}
getMainService().save(member);
return redirectTo("index", new RedirectEntity("member", member.getId()));
}
}
Теперь в моем тесте на контроллере я хочу убедиться, что мой метод post делает следующее:
- Перезагрузите страницу, если в BindingResults есть ошибки
- Мой сервис сохраняет сущность члена JPA в дБ (если нет ошибок)
- Метод перенаправляет меня на страницу индекса
Вот как выглядит мой (плохой) тестовый класс:
@RunWith(SpringRunner.class)
@TestPropertySource(locations="classpath:application_test.properties")
@WebAppConfiguration
public class RegisterMemberControllerTest {
private MockMvc mockMvc;
@MockBean
private MemberService memberService;
@MockBean
private RegisterMemberController controller;
@Before
public void init() {
mockMvc = MockMvcBuilders.standaloneSetup(controller).setViewResolvers(new StandaloneMvcTestViewResolver()).build();
controller.setMainService(memberService);
}
@Test
public void testIndex() throws Exception {
mockMvc.perform(get("/registerMember"))
.andExpect(status().isOk())
.andExpect(forwardedUrl("registerMember");
}
@Test
public void testHandleSubmit() throws Exception {
RegisterMemberBean registerMemberBean = new RegisterMemberBean();
registerMemberBean.setMember(TestFixture.getValidMemberWithoutReferences());
Member member = TestFixture.getValidMember();
mockMvc.perform(post(Page.REGISTER_MEMBER)).andExpect(status().isOk());
when(mockMvc.perform(post(Page.REGISTER_MEMBER)).andExpect((ResultMatcher) memberService.save(member)).andExpect(forwardedUrl("redirect:/index/member=" + member.getId() + ".html")));
}
}
в моем понимании весенний ботинок использует Mockito. У меня есть некоторый опыт работы с EasyMock, но я бы хотел максимально использовать пружинные значения по умолчанию. Может кто-нибудь показать, как этого добиться?
1 ответ
Я думаю, что есть небольшая путаница в том, что должно и не должно насмехаться.
Если я правильно прочитал ваш вопрос, вы на самом деле пытаетесь RegisterMemberController
, Таким образом, вам, скорее всего, НЕ следует издеваться над этим классом, но на самом деле тестировать этот класс.
Я считаю, что вы будете создавать фальшивки/ манекены/ заглушки/ шутки/ шпионы из ваших MemberService
, RegisterMemberBean
, а также BindingResult
классы.
Именно эти классы будут созданы вашим модульным тестом и переданы вашему контроллеру во время теста, что приведет к проверке логики, которую вы заинтересованы в доказательстве / опровержении.
К вашему сведению, при проверке того, что MemberService
класс был назван, вот где вы бы использовали макет. Остальные классы могут быть либо манекенами, либо заглушками.
Примечание: я бы порекомендовал удалить параметр Model из вашего метода handleSubmit(), поскольку он нигде не используется.