【Java】staticクラスのmock

Java

やりたいこと

  • Staticメソッドをテストする
  • テスト対象メソッドで別クラスのStaticメソッドを呼んでいる
  • テストを対象メソッドに絞るため、呼び出すメソッドはmockにしたい

サンプルコード

  • 使ったもの
    • JUnit
    • mockito
    • static mock

      テスト対象コード

テスト対象クラス

public class ReturnStringClass {
    public static String returnStr(){
        // getStrから文字列を取得
        String str = ManageStringClass.getStr();
        // 返り値は取得した文字列
        return str;
    }
}

テスト対象クラスから呼び出すクラス

public class ManageStringClass {
    public static String getStr(){
        // 文字列を定義
        String str = "test from method";
        // 定義した文字列を取得
        return str;
    }
}

サンプルコード実行結果

テスト対象メソッドをmainで呼び出すとこんな感じ

public class main {
    public static void main(String[] args){
        System.out.println(ReturnStringClass.returnStr());
    }
}

実行するとtest from methodが出力される

テストコード

  • mock化した値が入っていることを明確にするため、getStr()とは別の返り値をmockで定義した
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;
import org.mockito.Mockito;

public class ReturnStringClassTest {
    @Test
    void testReturnStr(){
        // ManageStringClassのmock化
        MockedStatic<ManageStringClass> mocked = Mockito.mockStatic(ManageStringClass.class);
        // mock化したクラスのメソッド返り値を定義
        mocked.when(ManageStringClass::getStr).thenReturn("test from Mock");

        // テスト対象を呼び出し
        String testStr = ReturnStringClass.returnStr();
        // mock化した値が返ってきているか確認
        Assertions.assertEquals("test from Mock", testStr);
    }
}

テスト実行結果

Test passedを確認

実行時の環境(build.gradle)

  • バージョンは各自新しいものをご確認ください
plugins {
    id 'java'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'

    // https://mvnrepository.com/artifact/org.mockito/mockito-core
    testImplementation 'org.mockito:mockito-core:4.3.1'
    // https://mvnrepository.com/artifact/org.mockito/mockito-inline
    testImplementation 'org.mockito:mockito-inline:4.3.1'
    // https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy
    implementation 'net.bytebuddy:byte-buddy:1.12.8'
    // https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy-agent
    testImplementation 'net.bytebuddy:byte-buddy-agent:1.12.8'

}

test {
    useJUnitPlatform()
}

参考

コメント

タイトルとURLをコピーしました