我想测试一个公共方法,在其中调用另一个私有方法,我使用以下反射方式获取私有方法并尝试模拟它的返回值,但它没有作为测试工作停在私人电话的地方。有什么建议吗?
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 :(得分:1)
使用cglib代理Spock模拟类。这样的代理不能模拟最终类或私有方法(因为私有方法是隐式最终的)。如果您的测试代码是用Groovy编写的(比如脚本或grails应用程序),那么您可以使用Spock GroovyMock
或修补元类:
setup:
HandlerClass.metaClass.test = { true }
given: "a handler"
def handler = new HandlerClass()
when: "i call test"
def r = handler.test()
then:
r == true
但是,您应该更多地关注代码的可测试性。必须模拟类通常不是关于代码的可维护性和可测试性的好兆头......
答案 1 :(得分:0)
您无法使用Mockito模拟私有方法。但如果有明确需要,那么你可以尝试查看PowerMock。
当您为公共方法编写测试时,它们不会为私有方法编写测试。
如果您在私有方法中调用了任何模拟,那么您可以通过执行以下操作来验证调用:
Mockito.verify(myMock, Mockito.times(1)).myMethod(myParams,...,...);