きり丸アドベントカレンダー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