きり丸アドベントカレンダー2020の11記事目です。
今回の記事でControllerのテストを行います。GET通信やPOST通信を行って、そのあとの挙動をテストします。
ゴール
- Controllerのテストを行う
できないこと
- WebMvcTestでのテスト
環境
- Java
- 15
手順
テストのためのインスタンスを生成する
@SpringBootTestを使用します。
GETメソッドやPOSTメソッドを動かすためのMockMvcクラスを活用します。
テスト対象のIndexControllerに対して@InjectMocksを設定すると、@Mockを付与しているクラスをDIすることになります。IndexControllerはTodoRepositoryとHttpSessionを使用しているため、それらに@Mockを付与してテストクラスを生成します。
アドベントカレンダーで10日目の記事にてセッションからデータを取得するようにしたため、Mockitoのwhenメソッドを使用して、メソッドを呼んだ時の返却値を別のものにします。
@SpringBootTest class IndexControllerTests { private MockMvc mockMvc; @Mock private TodoRepository todoRepository; @Mock private HttpSession httpSession; @InjectMocks private IndexController indexController; @BeforeEach void setup() { this.mockMvc = MockMvcBuilders.standaloneSetup(indexController).build(); AuthTargetUser user = new AuthTargetUser(new User("user", "pass", Collections.emptyList())); Authentication authentication = new UsernamePasswordAuthenticationToken(user, null); SecurityContext securityContext = new SecurityContextImpl(authentication); when(httpSession.getAttribute("SPRING_SECURITY_CONTEXT")).thenReturn(securityContext); }
テスト
セッションからユーザーを取得する処理をモックにしたので、DBから値を取得する処理も同様にモックにします。
あとは、mockMvcインスタンスでperformメソッドを呼び、返却値をandExpectメソッドで検証していきます。
中身に関してはHTTPステータスを確認するstatus、ビューを確認するview、設定値を確認するmodel等がありますので、駆使して確認します。
@Test void test_02() throws Exception { List<TodoDto> todos = List.of( TodoDto.builder().id(1).build(), TodoDto.builder().id(2).build(), TodoDto.builder().id(3).build() ); when(todoRepository.findList("user")).thenReturn(todos); mockMvc.perform(MockMvcRequestBuilders.get("/")) // レスポンスのステータスコードが200であることを検証する .andExpect(status().isOk()) // レスポンスのhtmlファイル名を検証する .andExpect(view().name("index")) // modelに設定した項目を検証する .andExpect(model().attribute("todos", todos)) ; }
ソースコード
アドベントカレンダー11日目。
github.com
終わりに
正直なところ、最低限の挙動確認はできているものの、ほとんどがMockitoを使用して返却値を設定してしまっているせいで、あまり深い意味がないテストとなっています。
本来であれば、ユーザーがログインしている前提のセキュリティ関係のテストができるといいのですが、私の力不足で最低限の確認しかできておりません。
慣れていないテストは難しいです。
この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。
参考記事
敬称略。
類似記事
きり丸アドベントカレンダー2020 adventar.org
きり丸のHerokuページ
https://kirimaru-todoapp.herokuapp.com/
12日目のアドベントカレンダーの記事 https://nainaistar.hatenablog.com/entry/2020/12/12/083000nainaistar.hatenablog.com
