2016-02-19 95 views
0

我想测试中,它调用另一个私有方法的公共方法,我用下面的反射方式获得私有方法,并试图嘲弄的返回值它,但它没有工作,因为测试停在私人电话的地方。有什么建议么?如何嘲笑一个私有方法的斯波克测试返回值

Method testMethod = handler.getClass().getDeclaredMethod("test", String.class) 
testMethod.setAccessible(true) 
testMethod.invoke(handler, "test string") >> true 

的TestMethod的如下所示:

private boolean test(String str) { 
    return true; 
} 
+0

哪个模拟框架您使用的? – user2004685

+0

spock + groovy。 – photosynthesis

+0

您是否试过简单地通过'metaClass'替换方法。最好替换私有方法使用的依赖项,而不是尝试替换该方法。但是如果类是Groovy,你应该能够执行以下操作:'instance.metaClass.test = {String s - > return true}'在该实例中拦截该调用。 –

回答

0

你不能嘲笑使用私有的Mockito方法。但是如果有明确的需求,那么你可以试着看看PowerMock。

它不应该写入测试的私有方法当你写的公共方法测试他们得到覆盖。通过使用CGLIB代理

Mockito.verify(myMock, Mockito.times(1)).myMethod(myParams,...,...); 
+0

谢谢,但情况是我可能不得不嘲笑该私有方法,因为它在运行时调用数据库服务,这在单元测试中不是首选。此外,我不在这里使用Mockito,而是使用spock和groovy。 – photosynthesis

+0

你应该模拟数据库调用而不是私有方法。这里有一个很好的答案,你为什么不能使用Spock + Groovy来模拟私有方法:http://stackoverflow.com/questions/26464980/why-can-test-private-methods-fields-in-spock-without-problems – user2004685

+0

这个答案是“为什么你可以访问私有方法”,而不是为什么你不能 –

0

斯波克mock类:

如果您的嘲笑中被称为私有方法,那么你可以验证由做这样的呼吁。这种代理不能模拟最终类或私有方法(因为私有方法隐含地是最终的)。如果测试下你的代码写在Groovy(如脚本或Grails应用程序),那么你可以使用斯波克GroovyMock或修补元类:

setup: 
    HandlerClass.metaClass.test = { true } 

given: "a handler" 
    def handler = new HandlerClass() 

when: "i call test" 
    def r = handler.test() 

then: 
    r == true 

但是,你应该更注重的可测性的码。不必mock类一般是不会对可维护性和代码的可测试性好兆头......

+0

我可以把所有这些步骤放在'给定'?我试过但似乎没有工作 – photosynthesis

+0

我用HandlerClass.metaClass.test = {String str - > true}来覆盖方法,但仍然没有运气,覆盖功能不适用于私有方法吗? – photosynthesis

+0

它只适用于常规代码,而不是java。只有groovy知道元类。如果你调用java代码,那么元类将被忽略 –