2011-11-09 34 views
4

我有以下代码:间谍的Mockito返回不同的结果比实际的方法调用

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

我写这个方法的单元测试。当我运行该方法没有嘲笑VTDGenparseFile方法返回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

我需要更多的帮助你,无论是在你的MYTEST()方法,或在您的parse()方法也许VTDGen.parseFile()。您正在创建一个间谍,但我没有看到验证码。 myFile从哪里来?我可能不需要所有这些信息,但比迄今为止所提供的更多。 – jhericks

+0

对不起,延迟回复。周末的东西。 'myTest'调用'parse'并且'myFile'被传入。关键是如果我注释掉'PowerMockito.whenNew','vg.parseFile'返回'true',但是'whenNew'就位(所以间谍被使用)'vg.parseFile'返回'false'。我认为间谍应该只是打电话给实际的实例,为什么返回的值不同? –

+0

所以你现在没有对你的间谍做任何实际的“间谍”?你怎么知道'vg.parseFile'返回的是什么? – jhericks

回答

1

也许是因为你是返回vtdGenMockvtgGenSpy

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

+0

这只是一个错字。 –

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); 
    } 
} 
+0

我用'PowerMockito.spy'试过了,无济于事。我如何知道Powermock/Mockito是否兼容?我使用Mockito 1.8.5和Powermock 1.4.9(我无法访问PowerMock 1.4.10)。 –

+0

看起来像PowerMock 1.3.9,它支持Mockito 1.8.5 –

1

这是广州澳凌的答​​复虽然有点间接的:你有没有包括@PrepareForTest(ClassCallingNewVTDGen 。类)?

它具有用于测试做好准备类调用

new VTDGen() 

。在广州澳凌的答​​案,这是Uo.class

Source

+0

是的,我做到了。我确实证实被测试的班级收到了间谍。 –

相关问题