実現したいこと
Mock+PowerMockを使用して、以下の2点を確認したい。
①テスト対象クラスの親クラスが呼び出している"super.~"をspyして任意の値を返しように設定したい。
②テスト対象クラスをspyして、テスト対象クラスのメソッドの呼び出し回数を確認したい。
発生している問題・エラーメッセージ
実現したいこと①を確認可能なテストコードとすると②が確認できなくなり、
実現したいこと②を確認可能なテストコードとすると①が確認できなくなる。
該当のソースコード
★AbsAクラス
Java
1public abstract class AbsA { 2 public String getHoge() { 3 return "Hoge"; 4 } 5}
★AbsBクラス
Java
1public abstract class AbsB extends AbsA{ 2 public String getFugaHoge() { 3 return "Fuga" + super.getHoge(); 4 } 5}
★テストスタブクラス
Java
1public class Stub extends AbsB { 2 public void doHoge() {} 3}
★テストクラス(①が確認可能だが②が確認できない)
Java
1@PrepareForTest({AbsA.class}) 2@RunWith(PowerMockRunner.class) 3public class AbsATest { 4 5 @Test 6 public void test() throws Exception { 7 8 Stub stub = new Stub(); 9 stub.doHoge(); 10 11 // super.~の戻り値設定 12 Method method = AbsA.class.getMethod("getHoge"); 13 PowerMockito.replace(method).with( 14 new InvocationHandler() { 15 @Override 16 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 17 return "Fuga"; 18 } 19 }); 20 21 // 実現したいこと① 22 assertEquals("FugaFuga", stub.getFugaHoge()); 23 // 実現したいこと② 24 Mockito.verify(stub, times(1)).doHoge(); 25 } 26 27}
★テストクラス(②が確認可能だが①が確認できない)
Java
1@PrepareForTest({AbsA.class}) 2@RunWith(PowerMockRunner.class) 3public class AbsATest { 4 5 @Test 6 public void test() throws Exception { 7 8 Stub stub = PowerMockito.spy(new Stub()); 9 stub.doHoge(); 10 11 // super.~の戻り値設定 12 Method method = AbsA.class.getMethod("getHoge"); 13 PowerMockito.replace(method).with( 14 new InvocationHandler() { 15 @Override 16 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 17 return "Fuga"; 18 } 19 }); 20 21 // 実現したいこと① 22 assertEquals("FugaFuga", stub.getFugaHoge()); 23 // 実現したいこと② 24 Mockito.verify(stub, times(1)).doHoge(); 25 } 26 27}
上記では、
Stub stub = new Stub();でテスト対象はspyしないか、
Stub stub = PowerMockito.spy(new Stub());でテスト対象をspyするかが異なる。
spyしなければ当然呼び出し回数の確認は行えないが、
spyするとsuper.~の戻り値を設定している部分が動作しなくなる。
参考サイト
★Mockitoの最低限な使い方
https://qiita.com/fumu238/items/64c910bc36b051c6b976
★PowerMockでsuperメソッド呼び出しをモックする方法
https://qiita.com/junn8k/items/9a2cc8ade20b73d6239a
補足情報(FW/ツールのバージョンなど)
■Junit
・JUnit4
■Mockito
・mockito-all-1.10.19.jar
■PowerMock
・powermock-mockito-release-full-1.6.2-full.jar

あなたの回答
tips
プレビュー