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



我有以下代码:

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的间谍对象不应该改变包装对象的行为,那么为什么我得到的是false而不是true?

可能是因为您在

中返回vtdGenMock而不是vtgGenSpy

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

当监视powermock类时,您应该使用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);
    }
}

这是在东方的答复,虽然有点间接:你包括@PrepareForTest(ClassCallingNewVTDGen.class)吗?

是调用

的类
new VTDGen()

必须为测试做准备。在东方的回答中,它是:class

相关内容

  • 没有找到相关文章

最新更新