4

次のコードがあります。

public Object parse(){
      ....
      VTDGen vg = new VTDGen();
      boolean parsed = vg.parseFile(myFile.getAbsolutePath(), false);
}

このメソッドの単体テストを書いています。VTDGenメソッドをモックせずにメソッドを実行すると、parseFileが返されますtrue。ただし、スパイでモックすると、 が返されますfalse

私のテストは次のとおりです。

@Before
public void setup(){
     VTDGen vtgGen = new VTDGen();
     VTDGen vtgGenSpy = PowerMockito.spy(vtdGen);
     PowerMockito.whenNew(VTDGen.class).withNoArguments().thenReturn(vtdGenSpy);

}


@Test
public void myTest(){
    // when I run the test parseFile returns false
    // if I remove the mocking in the setup, parseFile returns true
}

私は、Mockito のスパイ オブジェクトがラップされたオブジェクトの動作を変更するべきではないという印象を受けていました。

4

3 に答える 3

1

多分それはあなたが戻ってvtdGenMockいないからvtgGenSpyです

PowerMockito.whenNew(VTDGen.class).withNoArguments().thenReturn(vtdGenMock);

于 2011-11-09T13:58:58.380 に答える
1

Powermocked クラスをスパイする場合は、次のPowerMockito.spy(...)メソッドを使用する必要があります。

VTDGen vtgGenSpy = PowerMockito.spy(vtdGen);

また、Mockito/Powermock のバージョンの組み合わせに互換性があることを確認してください。Mockito 1.8.5 と Powermock 1.4.10 を使用しています。

次のテスト (TestNG) は合格です。

@PrepareForTest({VTDGen.class, Uo.class})
public class UoTest extends PowerMockTestCase {

    private VTDGen vtdGen;
    private VTDGen vtdGenSpy;
    private Uo unitUnderTest;

    @BeforeMethod
    public void setup() {
        vtdGen = new VTDGen();
        vtdGenSpy = PowerMockito.spy(vtdGen);
        unitUnderTest = new Uo();
    }

    @Test
    public void testWithSpy() throws Exception {
        PowerMockito.whenNew(VTDGen.class).withNoArguments().thenReturn(vtdGenSpy);

        boolean result = unitUnderTest.parse();

        assertTrue(result);
    }

    @Test
    public void testWithoutSpy() throws Exception {
        PowerMockito.whenNew(VTDGen.class).withNoArguments().thenReturn(vtdGen);

        boolean result = unitUnderTest.parse();

        assertTrue(result);
    }
}

テスト対象ユニットの場合:

public class Uo {
    public boolean parse() {
        VTDGen vg = new VTDGen();
        return vg.parseFile("test.xml", false);
    }
}
于 2011-11-18T13:35:26.213 に答える
1

これは、間接的ではありますが orien の返信でした: @PrepareForTest(ClassCallingNewVTDGen.class) を含めましたか?

クラスコールです

new VTDGen()

テストの準備が必要です。orienの答えでは、それはUo.classです

ソース

于 2011-11-23T18:54:25.237 に答える