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

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

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

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

Spring Boot

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

Q&A

解決済

1回答

65閲覧

mockitoによる初期画面へのリダイレクト検証

Fitz

総合スコア1

Java

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

Spring Boot

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

0グッド

0クリップ

投稿2025/02/02 06:10

実現したいこと

選択したデータを削除する処理で初期画面へのリダイレクトを検証する処理の記述

発生している問題・分からないこと

初期画面へリダイレクトを検証する記述を行うが、エラーが発生する

エラーメッセージ

error

1java.lang.AssertionError: Redirected URL expected:</delete> but was:<null> 2 at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:59) 3 at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:122) 4 at org.springframework.test.web.servlet.result.MockMvcResultMatchers.lambda$redirectedUrl$2(MockMvcResultMatchers.java:130) 5 at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:214) 6 at com.example.demo.DemoControllerTest.testDelete(DemoControllerTest.java:188) 7 at java.base/java.lang.reflect.Method.invoke(Method.java:580) 8 at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) 9 at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) 10 11

該当のソースコード

DemoControllerTest

1package com.example.demo; 2 3import static org.hamcrest.Matchers.*; 4import static org.mockito.BDDMockito.*; 5import static org.mockito.Mockito.*; 6import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; 7import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*; 8import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; 9 10import java.util.ArrayList; 11import java.util.Arrays; 12import java.util.List; 13 14import org.junit.jupiter.api.BeforeEach; 15import org.junit.jupiter.api.DisplayName; 16import org.junit.jupiter.api.Test; 17import org.junit.jupiter.api.extension.ExtendWith; 18import org.mockito.junit.jupiter.MockitoExtension; 19import org.springframework.beans.factory.annotation.Autowired; 20import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; 21import org.springframework.boot.test.mock.mockito.MockBean; 22import org.springframework.test.web.servlet.MockMvc; 23import org.springframework.test.web.servlet.setup.MockMvcBuilders; 24import org.springframework.web.context.WebApplicationContext; 25 26 27/* 28 * ここではDemoControllerTestのテストに必要なアノテーションを付与して以下のテストを完成させてください。 29 * また、必要に応じてインポートも行ってください。 30 */ 31 32@SuppressWarnings("unused") 33//テストに必要なアノテーションを付与し引数も記述してください。 34//↓に記述 35 36//Mockitoを使用する為にアノテーションを付与し引数も記述してください。 37//↓に記述 38@WebMvcTest(DemoController.class) 39@ExtendWith(MockitoExtension.class) 40public class DemoControllerTest { 41 42 private MockMvc mockMvc; 43 44 private Member member; 45 46 // テストの実行時に必要なアノテーションを付与してください。 47 // ↓に記述 48 @Autowired 49 private WebApplicationContext context; 50 51 // 必要なアノテーションを付与し、コントローラーが依存するクラスをモック化してください。 52 // ↓に記述 53 @MockBean 54 private MemberRepository repos; 55 56 @BeforeEach 57 public void setUp() { 58 // テストの際に使用するwebApplicationContextを指定し、mockMvcを生成してください。 59 // ↓に記述 60 mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); 61 member = new Member(); 62 63 } 64 65 66 // 選択したデータを削除する処理を記述してください。 67 @Test 68 @DisplayName("削除処理のテスト") 69 public void testDelete() throws Exception{ 70 // MockMvcのperformメソッドを呼び出し疑似的なリクエストを実行してください。 71 // ↓に記述 72 mockMvc.perform((get("/delete")) 73 .param("id", "3")) 74 .andDo(print()) 75 // 初期画面へのリダイレクトを検証する処理を記述してください。 76 // ↓に記述 77 .andExpect(redirectedUrl("/")); 78 79 // verifyメソッドを使用し、deleteByIdが1回呼ばれたこと検証する処理を記述してください。 80 // ↓に記述 81 verify(repos, times(1)).deleteById(3); 82 } 83 84}

DemoController

1package com.example.demo; 2 3import java.util.List; 4 5import org.springframework.beans.factory.annotation.Autowired; 6import org.springframework.stereotype.Controller; 7import org.springframework.transaction.annotation.Transactional; 8import org.springframework.web.bind.annotation.GetMapping; 9import org.springframework.web.bind.annotation.ModelAttribute; 10import org.springframework.web.bind.annotation.PostMapping; 11import org.springframework.web.bind.annotation.RequestParam; 12import org.springframework.web.servlet.ModelAndView; 13 14import jakarta.annotation.PostConstruct; 15 16/* 17ここではControllerに必要なアノテーションを付与して以下の処理と画面遷移を完成させてください。 18課題の画像やhtmlファイルを参考に適切な引数を入れていきましょう。 19*/ 20 21//①Controllerクラスに必要なアノテーションを付与してください。 22@Controller 23public class DemoController { 24 25 @Autowired 26 //②MemberRepositoryのインスタンスを生成してください。 27 MemberRepository repos; 28 29 /* 一覧画面(初期画面)への遷移 */ 30 //③初期画面へアクセスされたときの処理 31 //まずはアノテーションを付与して初期画面へのマッピングを下に記述 32 33 @GetMapping("/") 34 public ModelAndView list() { 35 ModelAndView mav = new ModelAndView(); 36 List<Member> list = repos.findAll(); 37 //初期画面のhtmlを指定してください。()内に記述 38 mav.setViewName("members/list"); 39 //ビューに表示させたいデータを引数名と値を指定してhtmlに引き渡してください。 40 mav.addObject("data", list); 41 return mav; 42 } 43 44 /* 新規画面への遷移 */ 45 //④新規登録画面へアクセスされたときの処理 46 //まずはアノテーションを付与して新規登録画面へのマッピングをおこなってください。 47 48 @GetMapping("/add") 49 ModelAndView add() { 50 ModelAndView mav = new ModelAndView(); 51 Member data = new Member(); 52 mav.addObject("formModel", data); 53 //新規登録画面のhtmlを指定してください。 54 mav.setViewName("members/new"); 55 return mav; 56 } 57 58 /* 編集画面への遷移 */ 59 @GetMapping("/edit") 60 ModelAndView edit(@RequestParam int id) { 61 ModelAndView mav = new ModelAndView(); 62 Member data = repos.findById(id); 63 mav.addObject("formModel", data); 64 mav.setViewName("members/new"); 65 return mav; 66 } 67 68 /* 更新処理 */ 69 //⑤データを受け取り、更新を行う処理です。適切なアノテーションを付与してどこからデータを受け取るのか指定してください。 70 71 @PostMapping("/create") 72 @Transactional(readOnly=false) 73 public ModelAndView save( 74 @ModelAttribute("formModel") Member member) { 75 repos.saveAndFlush(member); 76 return new ModelAndView("redirect:/"); 77 } 78 79 /* 削除処理 */ 80 @PostMapping("/delete") 81 @Transactional(readOnly=false) 82 public ModelAndView delete(@RequestParam int id) { 83 repos.deleteById(id); 84 return new ModelAndView("redirect:/"); 85 } 86 87 /* 初期データ作成 */ 88 @PostConstruct 89 public void init() { 90 Member member1 = new Member(); 91 member1.setName("島根 花子"); 92 member1.setAddress("島根県松江市浜乃木1-2-3"); 93 member1.setTel("0852-12-1234"); 94 repos.saveAndFlush(member1); 95 96 member1 = new Member(); 97 member1.setName("大阪 太郎"); 98 member1.setAddress("大阪府豊中市本町1-2-3"); 99 member1.setTel("06-123-7777"); 100 repos.saveAndFlush(member1); 101 } 102}

list.html

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>Members List</title> 6<style> 7table { 8 border-collapse: collapse; 9} 10.col_name {width: 100px;} 11.col_address {width: 500px;} 12.col_tel {width: 200px;} 13</style> 14</head> 15<body> 16<h1>住所録</h1> 17<hr> 18<!--①タイムリーフのif文でデータがあるときと何もないときで表示を切り替えます。 19//()内に適切な変数を入れて切り替えられるようにしてください。--> 20<p th:if="${#lists.isEmpty(data)}">データがありません</p> 21<span th:if="${!#lists.isEmpty(data)}"> 22<table border="1"> 23 <tr> 24 <th class="col_name">名前</th> 25 <th class="col_address">住所</th> 26 <th class="col_tel">電話番号</th> 27 <th></th> 28 <th></th> 29 </tr> 30 <tr th:each="obj : ${data}"> 31 <td th:text="${obj.name}"></td> 32 <td th:text="${obj.address}"></td> 33 <td th:text="${obj.tel}"></td> 34 <td> 35 <form action="/edit" method="get"> 36 <input type="submit" value="編集"> 37 <input type="hidden" name="id" th:value="${obj.id}"> 38 </form> 39 </td> 40 <td> 41 <form action="/delete" method="post"> 42 <input type="submit" value="削除"> 43 <input type="hidden" name="id" th:value="${obj.id}"> 44 </form> 45 </td> 46 </tr> 47</table> 48<hr> 49</span> 50<form action="/add"> 51 <input type="submit" value="新規追加" /> 52</form> 53</body> 54</html>

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

同コード内で記述されている初期画面へのリダイレクト検証を参考にしたが、エラー。
「mockito 初期画面 リダイレクト検証」で検索を行ったが、参考文献は見つかりませんでした。

補足

特になし

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。
削除のメソッドはリクエストがpost形式だったためテスト用メソッドをgetからpostに変更したところ動きました。

投稿2025/02/02 08:47

Fitz

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.33%

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

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

質問する

関連した質問