#質問者のレベル感
業務に入って5か月目の駆け出し。
Springのテストコードをまともに書いたのは初めてです。
#環境
Java:14
IDE:STS
Spring2.3.4
ORM:Mybatis
OS:Windows10
#実現したいこと
ユーザー登録を行うフォームのPOSTリクエストが正常に行われるかを検証するテストコードを作成したい。
#発生している問題
java.lang.AssertionError: No ModelAndView foundが発生しテストが失敗する。(エラーではない)
#対処・現状
(1)テスト用DBへの接続は確認済み
(2)Getリクエストのテストは成功している
(3)ブラウザの画面からテスト用データと同様の値を入力した場合、正常に登録処理が行われることを確認済み
(4)MockMvcのandExpectメソッドから例外に遷移することを確認済み
#仮説
テストコードの記述が何かしら足りず、挙動を再現できていないように思います。
私の解釈ではこれらの記述で挙動を再現できていると考えておりますが、どなたかご教示いただけましたら幸いでございます。
#ソース・エラー
テストコード package com.example.demo.controller; <import文宣言省略> @SpringBootTest @TestPropertySource(locations="classpath:test.properties") @AutoConfigureMockMvc @Sql(statements = { "INSERT INTO sales_members(sales_member_name, sales_member_email, sales_member_tel, password) VALUES ('ユーザー1', 'hoge@email.com', '09093394360', '$2a$10$xRTXvpMWly0oGiu65WZlm.3YL95LGVV2ASFjDhe6WF4.Qji1huIPa')", "INSERT INTO sales_members(sales_member_name, sales_member_email, sales_member_tel, password) VALUES ('ユーザー2', 'fuga@email.com', '08092392360', '$2a$10$xRTXvpMWly0oGiu65WZlm.3YL95LGVV2ASFjDhe6WF4.Qji1huIPa')"}) public class SignupControllerTest { MockMvc mockMvc; @MockBean SignupService signupService; @MockBean SignupForm signupForm; @MockBean SalesMembers salesMembers; @InjectMocks SignupController signupController; @Autowired MockHttpServletRequest mhsRequest; // Mockの初期化を行うメソッドです @BeforeEach void initMocks() { // モキートアノテーションの有効化 MockitoAnnotations.initMocks(this); // MockMvcのセットアップ mockMvc = MockMvcBuilders.standaloneSetup(signupController).alwaysDo(log()).build(); } @Test void GETリクエストを送信して新規登録画面のレスポンスが返ってくること() throws Exception { SignupForm signupForm = new SignupForm(); mockMvc.perform(get("/signup")).andExpect(status().isOk()) .andExpect(model().attribute("signupForm", signupForm)) .andExpect(view().name("register/signup.html")); } @Test void フォームに入力値を持たせてPOSTリクエストを送信した場合に正常に処理されること() throws Exception { SignupForm signupForm = new SignupForm(); signupForm.setSalesMemberId(1); signupForm.setPassword("password"); signupForm.setSalesMemberEmail("test@email.com"); signupForm.setSalesMemberName("テストユーザー"); signupForm.setSalesMemberTel("07000000000"); signupForm.setUserName("test"); mockMvc.perform(post("/signup").flashAttr("signupForm", signupForm)) .andExpect(model().hasNoErrors()) .andExpect(model().attribute("signupForm", signupForm)) .andExpect(redirectedUrl("/signup")); verify(signupService, times(1)).create(signupForm); } }
/** * @author noda 営業メンバー登録のコントローラークラスです */ @Controller public class SignupController { @Autowired SignupService signupService; @Autowired PasswordEncoder passwordEncorder; @Autowired SalesMemberMapper salesMemberMapper; @GetMapping("/signup") public String getSignup(@ModelAttribute SignupForm signupForm, Model model) { model.addAttribute("signupForm", signupForm); return "register/signup.html"; } @PostMapping("/signup") public String postSignup(@ModelAttribute @Validated(GroupOrder.class) SignupForm signupForm, BindingResult bindingResult, Model model, RedirectAttributes redirectAttributes, @RequestParam("salesMemberName")String salesMemberName) { SalesMembers salesMember = salesMemberMapper.findOneSalesMemberByUserName(salesMemberName); if(bindingResult.hasErrors()) { model.addAttribute("failed", "登録に失敗しました"); return getSignup(signupForm, model); } if(salesMember != null) { model.addAttribute("failed", "登録済みのユーザー名です"); return getSignup(signupForm, model); } else { signupService.create(signupForm); redirectAttributes.addFlashAttribute("success", "登録が完了しました"); } return "redirect:/signup"; } }
/** * @author noda * 営業メンバー登録のサービスクラスです */ @Service public class SignupService { @Autowired SalesMemberMapper salesMemberMapper; public void create(SignupForm signupForm) { salesMemberMapper.create(signupForm); } }
あなたの回答
tips
プレビュー