wiki@y-kurose

日々是好日。

ユーザ用ツール

サイト用ツール


サイドバー

サイドバー

プログラミング:java:mockito:モックライブラリmockitoでsingletonオブジェクトをモック化する

モックライブラリMockitoでSingletonオブジェクトをモック化する

Mockito

  • Javaのモックライブラリの一つ
  • 実装や単体試験中に必要となるモックを作れる
  • 今回はSingleton(シングルトン)オブジェクトのモック化方法について

入手

モック化の対象

  • 以下のようなSingletonクラス
public class Manager {
 
    //インスタンス
    private static Manager inst = null;
 
    //シングルトンインスタンス取得
    public static synchronized Manager getInstance() {
        if (inst == null) {
            inst = new Manager();
        }
        return inst;
    }
 
    //デフォルトコンストラクタ(シングルトンパターンのためprivateで宣言)
    private Manager() { }
 
    //何か処理
    public void doSomething(String param) {
    }
}

テスト対象

  • 以下のようにSingletonオブジェクトを利用している
public class User {
    public void call() {
        Manager.getInstance().doSomething("パラメーター");
    }
}

テスト

  • リフレクションも使って無理やりインスタンスを置き換える
public class UserTest extends TestCase {
 
    public void test_callメソッド() throws Exception {
        //mockitでManagerのモックを作る
        Manager mockManager = mock(Manager.class);
 
        //リフレクションでインスタンスをモックに書き換えてしまう
        Field manager = Manager.class.getDeclaredField("inst");
        if (!manager.isAccessible()) {
            manager.setAccessible(true);
        }
        manager.set(Manager.getInstance(), mockManager);
 
        //モックの動きを指定
        doAnswer(new Answer<Object>() {
            @Override
            public Object answer(InvocationOnMock invocation) throws Throwable {
 
                //呼ばれた時の引数も取り出せる
                Object[] args = invocation.getArguments();
                assertEquals("引数の確認", "パラメーター", args[0]);
                return null;
            }
        }).when(mockManager).doSomething(anyString());
 
        //実際に実行
        new User().call();
    }
}
  • この例ではSingletonオブジェクトのメソッドを呼んでいることを確認している
  • メソッドの挙動を指定して別の試験を行うこともできる


プログラミング/java/mockito/モックライブラリmockitoでsingletonオブジェクトをモック化する.txt · 最終更新: 2019/10/05 23:07 by y-kurose