如何在spock测试中模拟私有方法的返回值

时间:2016-02-19 16:27:43

标签: java unit-testing groovy spock

我想测试一个公共方法,在其中调用另一个私有方法,我使用以下反射方式获取私有方法并尝试模拟它的返回值,但它没有作为测试工作停在私人电话的地方。有什么建议吗?

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;
}

2 个答案:

答案 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,...,...);