1

非常に単純に思えることを実行するための最善の方法を見つけようとしています。特定のメソッドが、テスト対象のクラスからコラボレーターで呼び出されていることをテストします。JDK 6 で Mockito (1.9.5) & PowerMock (1.5.1) を使用しています。

一般的なアプローチは、 Mockito を介して部分モックを設定し、spyPowerMock メソッドを介して内部状態を設定して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()明らかにそうではありません。または、他の何か。

同じことを達成する他のアプローチには間違いなくオープンですが、ここで何が欠けているのか知りたいです。

注: インポートの問題ではないようですので省略しましたが、役に立つと思われる場合は含めることができます。

4

1 に答える 1

0

私が抱えていた問題はかなり単純でした。この質問の最初のバージョンでは見ることもできませんでした。

問題はproduce()FactoryI set viaWhiteBox.setInternalState()が呼び出されたときに、そのメソッドが適切にスタブ化されなかったため、null が返されることでした。だからbar私が電話しようとしたときにnullだったbar.create():したがってNPE。

を適切にスタブすることで修正されproduce()ましたFooGateTest:

when(mockfactory.produce((Class)anyObject())).thenReturn(mockBar);

...そしてテストは成功し、エラーはありません。

于 2013-06-24T15:29:21.513 に答える