【问题标题】:How to mock Autowired objects(java) and inject inside to a spy object in Spock如何模拟 Autowired 对象(java)并在 Spock 中注入间谍对象
【发布时间】:2019-06-24 03:42:37
【问题描述】:

如何将模拟对象注入 Spock 中的间谍实例?

例子:

测试类

class Service {

     @AutoWired
     private Util util;

     public void testMethod(int a, int b) {

         int c = sum(a,b);
         util.format(c);
     }

     private int sum(int a, int b) {
        ......
     }
}

斯波克:

def "testMethod with valid inputs"() {

    given:
       def serviceSpy    = Spy(Service)
       //spy.util          = Mock(Util) I can't do this
       spy.sum(_,_) >> 2

    ......
}

那么,我的疑问是如何将模拟对象注入到间谍实例中?

我试图窥探现有实例,但它没有对测试类中的方法存根。

有人可以建议我吗,我可以在这里做什么?或者我可以使用 Junit(Mockito) 轻松解决它吗?

【问题讨论】:

  • 将 Spock 版本升级到 1.3 后,我可以监视现有实例 def serviceSpy = Spy(service) 使用它,我将模拟对象注入间谍的问题已解决。而且由于我无法存根私有方法(在间谍类上),我将方法更新为受保护,现在它工作正常。但我想知道是否可以像我们在 powermockito 中所做的那样在间谍类上存根私有方法```PowerMockito.doReturn(3).when(spiedObject, "methoidName", ...); `

标签: java junit mockito spock powermockito


【解决方案1】:

你可以使用“constructorArgs”

这是一个例子:

def util = Stub(Util) // or whatever
def serviceSpy = Spy(Service, constructorArgs: [util])

但是,要使其正常工作,请不要在字段上使用 @Autowire。撇开 spring 在现实生活中运行它的事实不谈,对于这样的测试,你可能没有 spring。 所以显式放置依赖引用会破坏封装,在任何情况下都不起作用。

相反,我建议使用构造函数依赖:

class Service {

    private final Util util;

    @Autowired // in recent versions of spring no need to use this annotation
    public Service(Util util) {  
      this.util = util;
    }
}

【讨论】:

  • 我可以使用 JUnit(Mockito) 解决它而不对源代码做任何更改吗?
  • Spy 是 Spock 的一部分,所以这里不需要 Mockito。 Spy 是基于真实对象的代理,因此该代理没有“util”字段。因此,如果要设置“util”字段,则需要访问 Spy 代理包装的真实对象,然后使用反射。在 Mockito 中,这将是相同的,并且不推荐使用,因为代理必须对调用者“透明”。
  • 但是在 mockito 中,我可以选择传递现有的测试类对象并创建一个间谍对象。这样,我就不必再次注入模拟对象了。如果我没记错的话,我们在 spock 中没有这个选项(Creating spy object based on existing instance),对吧
  • 好吧,在 Spock 中,你应该能够从 1.1-rc4 开始执行此操作:阅读发行说明:spockframework.org/spock/docs/1.1/release_notes.html 但我还没有找到任何使用此功能的示例
  • 顺便说一句,如果您愿意,您可以使用 Mockito 创建一个间谍,它也应该可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多