Controllerクラスの単体テストをJUnitで行った際に、jakarta.servlet.ServletException: Circular view path というエラーを解決した方法の備忘録です。
Circular view pathのエラーの原因はこれだけではないと思いますが、自分でエラー原因を調べていたときに、なかなか検索にヒットしなかったため、投稿することにしました。
(私は初学者なので記事に間違いがあるかもしれません。指摘やアドバイス、コメント等があれば遠慮なくお願いいたします。)
環境
Spring Tool Suite 4.21.1
JUnit 5
実行したControllerTestクラス
ControllerTestクラスのコードのうち、問題のエラーが発生した箇所を抜粋します。
// サービスクラスから"success"の結果が返ってきたとき、complete.htmlを返すかどうかをテストする
@Test
void test() throws Exception {
when(sampleService.process("id","pw")).thenReturn("success");
mockMvc.perform(post("/complete").param("ID","id").param("PW", "pw"))
.andExpect(view().name("complete")); // エラーが発生
}
今回発生したエラー
上記のテストコードを実行すると、jakarta.servlet.ServletException: Circular view path というエラーが発生しました。
jakarta.servlet.ServletException: Circular view path [complete]: would dispatch back to the current handler URL [/complete] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
エラーの内容を簡単に和訳すると、
「URLである"/complete"に再びディスパッチされます。ViewResolver の設定を確認してください。 (ヒント: 未指定のビューの結果である可能性があります。)」
とのこと。
エラーの原因・解決方法
エラーの原因は、post先のURLとviewのhtmlファイル名が同じ名前(complete)だったことです。
つまり解決するには、post先のURLとviewのhtmlファイル名を異なる名前にする必要があります。
例えば、view先を"complete"から"complete.html"に変更すると、エラーは起きなくなります。
※このとき、Controllerクラスのソースコードも変更に対応するのを忘れずに。
@Test
void test() throws Exception {
when(sampleService.process("id","pw")).thenReturn("success");
mockMvc.perform(post("/complete").param("ID","id").param("PW", "pw"))
.andExpect(view().name("complete.html")); // エラーは発生しない
}