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