Mockito间谍返回的结果与实际方法调用不同

时间:2011-11-09 13:45:19

标签: java mockito powermock vtd-xml

我有以下代码:

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的间谍对象不应该改变被包裹物体的行为,那么为什么我会变得虚假而不是真实?

3 个答案:

答案 0 :(得分:1)

也许是因为你在

中退回vtdGenMock而不是vtgGenSpy

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

答案 1 :(得分: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);
    }
}

答案 2 :(得分:1)

这是在orien的回复中,虽然有点间接:你是否包括@PrepareForTest(ClassCallingNewVTDGen.class)?

这是调用的课程

new VTDGen()

必须准备好进行测试。在orien的回答中,它是Uo.class

Source