LoginSignup
1
2

More than 1 year has passed since last update.

Junit備忘録【サービス・ロジック層】

Last updated at Posted at 2021-04-29

現場で何回も調べてしまうので備忘録して内容をまとめる

Mock 返り値にdummyの変数をセット

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;

    @Autowired
    DemoService demoService;

    @Mock
    DemoLogic demoLogic;

    @Test
    void demoTest() {
        when(demoLogic.DemoLongLogic()).thenReturn(1L);

        // 引数ある場合はany()で
        when(demoLogic.DemoLongLogic(any())).thenReturn(1L);
    }

Mock 返り値なし voidの場合

        doNothing().when(demoLogic).DemoVoidLogic();

Mock 返り値が配列

        Users users1 = new Users();
        Users users2 = new Users();
        //配列が一つの場合
        when(demoLogic.DemoListLogic(any())).thenReturn(Collections.singletonList(users1));
        //配列が複数の場合
        when(demoLogic.DemoListLogic(any())).thenReturn(Arrays.asList(users1, users2));

Mock CompletableFuture 非同期処理メソッド

基本的には他のMockと変わらないが返却値にCompletableFuture.completedFutureが必要

        when(demoLogic.DemoLongLogicAsync()).thenReturn(CompletableFuture.completedFuture(1L));        

Mock 強制的にException エラー発生させる

        when(demoLogic.DemoLongLogic()).thenThrow(new RuntimeException());          

Mock 強制的にException エラー発生させる 戻り値がVoid

        doThrow(new RuntimeException()).when(demoLogic).DemoVoidLogic();       

強制的にException エラーメッセージの確認

ターゲットメソッドで使用

        Exception exception = assertThrows(Exception.class, () -> demoService.DemoLongService());
        assertEquals("エラーが発生しました", exception.getMessage());          

テスト中対象のメソッドが何回呼ばれたか監視する

        verify(demoLogic, times(1)).DemoVoidLogic();

Loggerの確認

        @Captor
        ArgumentCaptor<String> messageCaptor;
        @Captor
        ArgumentCaptor<Exception> exceptionCaptor;
        @Mock
        Logger logger;

//省略

        verify(logger, times(1)).error(messageCaptor.capture(), execptionCaptor.capture());
        assertThat(messageCaptor.getValue()).isEqualTo("DEMO");
        assertThat(execptionCaptor.getValue()).isNotNull();

Loggerの確認(@Slf4j)

import ch.qos.logback.classic.Logger;

        @Captor
        private ArgumentCaptor<LoggingEvent> captorLoggingEvent;

        @Mock
        private Appender mockAppender;

//省略

        Logger logger = (Logger) LoggerFactory.getLogger(DEMO.class);
        logger.addAppender(mockAppender);

        verify(mockAppender, times(1)).doAppend(captorLoggingEvent.capture());
        // ログレベルの確認
        assertEquals("INFO", captorLoggingEvent.getValue().getLevel().toString());
        // メッセージの確認
        assertEquals("demo_message", captorLoggingEvent.getAllValues().get(0).getMessage());

any()についての注意 NullpointerException ~~~argument matchers: any()

なんでもかんでもany()にすれば良いというわけではなく
引数がLongならanyLong() StringならanyString()と設定する必要がある

    when(demoLogic.DemoLongLogic(any())).thenReturn(1L); //ではなく
    when(demoLogic.DemoLongLogic(anyLong())).thenReturn(1L);

@MockBeanの使いどころ

基本的には@Mockで問題ない
インタフェースでBeanなどを読み込んでいる部分などには@MockBeanでモック化が可能になる
またメソッド内で別のメソッドを呼び出しそこにあるメソッドをモック化したい場合は使用する
@MockBeanを使いすぎると重くなのでなるべく量は減らすように

    public class DemoBean implements InitializingBean {
        // 省略
        }

まだまだ量が多くなりそうなのでここまで。。。(更新予定)
次回は
・Daoのテスト
・APIのテストJsonでスタブをひっかけるテストを書いていこうかな

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2