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) { } }
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(); } }