【Mockito】mockStaticであるメソッドだけは普通に動作させたいな~、させてみせる

mockStaticを使用して特定のstaticメソッドをモック化できます

さて、実装の中でモック化したクラスのメソッドを2種類使用していたとします

一つはモックとし、一方は実装通りに返却させたい場合というのは必ず出てきます

こんな風に実装してみてください

今回はLocalDateTimeクラスを対象としてみます

import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.when;
import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;
import java.time.LocalDateTime;

public class LocalDateTimeTest {

    @Test
    void testNowAndParse() {
        LocalDateTime expectedNow = LocalDateTime.of(2023, 10, 27, 10, 0);

        try (MockedStatic<LocalDateTime> mockedStatic = mockStatic(LocalDateTime.class)) {
            // now()メソッドをモックして、期待する値を返すようにする
            mockedStatic.when(LocalDateTime::now).thenReturn(expectedNow);

            // parseメソッドをモックしない(モック化されないようにする)
            mockedStatic.when(() -> LocalDateTime.parse(any(String.class)))
                        .thenCallRealMethod();

            // テスト
            LocalDateTime nowResult = LocalDateTime.now();
            LocalDateTime parseResult = LocalDateTime.parse("2023-10-27T10:00");

            assertEquals(expectedNow, nowResult); // now()メソッドがモックされていることを確認
            assertEquals(parseResult, LocalDateTime.of(2023, 10, 27, 10, 0)); // parse()メソッドが実際の結果を返すことを確認
        }
    }
}

このように、「mockedStatic.when(() -> LocalDateTime.parse(…)).thenCallRealMethod();」とすることで、parseメソッドはモックせずに実際の処理を呼び出すように設定できます

またこんな方法もあります

mockedStatic.when(() -> LocalDateTime.parse(any(String.class)))
            .thenAnswer(invocation -> LocalDateTime.parse(invocation.getArgument(0)));

thenAnswerを使ってLocalDateTime.parse()を呼び出す実装を手動で指定する方法

是非参考にしてみてください

是非フォローしてください

最新の情報をお伝えします