質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

0回答

3754閲覧

SpringBootのControllerクラスのテスト

NodaYudai

総合スコア8

JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2020/12/01 23:26

#質問者のレベル感
業務に入って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); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/12/01 23:50

業務関係なら先輩や上司などに聞くべきでは
NodaYudai

2020/12/02 00:48 編集

言葉足らずで申し訳ないのですが、自学習の一環で作成しているコードです。 既に質問はしたのですが、なかなか確認する時間が取れないようでしたので、より多くの知見が得られるteratailを利用させていただいている次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問