きり丸の技術日記

技術・エンジニアのイベント・資格等はこちらにまとめる予定です

【SpringBoot】Controllerのテストを行う(Not RestController)

きり丸アドベントカレンダー2020の11記事目です。


今回の記事でControllerのテストを行います。GET通信やPOST通信を行って、そのあとの挙動をテストします。

ゴール

  • Controllerのテストを行う

できないこと

  • WebMvcTestでのテスト

環境

手順

テストのためのインスタンスを生成する


@SpringBootTestを使用します。

GETメソッドやPOSTメソッドを動かすためのMockMvcクラスを活用します。

テスト対象のIndexControllerに対して@InjectMocksを設定すると、@Mockを付与しているクラスをDIすることになります。IndexControllerTodoRepositoryHttpSessionを使用しているため、それらに@Mockを付与してテストクラスを生成します。

アドベントカレンダーで10日目の記事にてセッションからデータを取得するようにしたため、Mockitowhenメソッドを使用して、メソッドを呼んだ時の返却値を別のものにします。

@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でのシェアや、今後も情報発信しますのでフォローよろしくお願いします。

参考記事

敬称略。

公式 spring.pleiades.io

類似記事

きり丸アドベントカレンダー2020 adventar.org

きり丸のHerokuページ
https://kirimaru-todoapp.herokuapp.com/

12日目のアドベントカレンダーの記事 https://nainaistar.hatenablog.com/entry/2020/12/12/083000nainaistar.hatenablog.com

f:id:nainaistar:20201109133010p:plain