非常に単純に思えることを実行するための最善の方法を見つけようとしています。特定のメソッドが、テスト対象のクラスからコラボレーターで呼び出されていることをテストします。JDK 6 で Mockito (1.9.5) & PowerMock (1.5.1) を使用しています。
一般的なアプローチは、 Mockito を介して部分モックを設定し、spy
PowerMock メソッドを介して内部状態を設定してWhiteBox
から、テストしているメソッドを呼び出すことです: creatFoo()
.
私が得ているものの要点を理解しながら、可能な限りコードを簡素化しました。テスト中のクラスは次のとおりです。
public class FooGate {
BlackBox.Factory factory;
BlackBox.Bar bar;
public void createFoo(Foo foo) {
bar = factory.produce(BlackBox.Bar.class);
bar.create(bbFoo);
}
...
}
動作しないテストは次のとおりです。
@RunWith(PowerMockRunner.class)
@PrepareForTest(FooGate.class)
public class FooGateTest {
@Test
public void test() {
FooGate testGate = Mockito.spy(new FooGate());
BlackBox.Factory mockfactory = mock(BlackBox.Factory.class);
BlackBox.Bar mockBar = mock(BlackBox.Bar.class);
WhiteBox.setInternalState(testGate, BlackBox.Factory, mockFactory);
WhiteBox.setInternalState(testGate, BlackBox.Bar, mockBar);
Foo foo = new Foo();
foo.setSetting("x");
doAnswer(new Answer<Void>() {
public Void answer(InvocationOnMock invocation) {
... do stuff ...
}
}).when(mockBar).create(any(Foo.class));
// NPE here: seems like bar is null in testGate.
testGate.createFoo(foo);
assertStuff(...);
}
}
WhiteBox.set... を削除するとFactory
、NPE が発生しfactory.produce()
ます。それで、それはうまくいっているようです。
しかし、doAnswer()
明らかにそうではありません。または、他の何か。
同じことを達成する他のアプローチには間違いなくオープンですが、ここで何が欠けているのか知りたいです。
注: インポートの問題ではないようですので省略しましたが、役に立つと思われる場合は含めることができます。