是否可以覆盖对进样器的调用?

时间:2016-02-25 22:16:13

标签: java guice spock

我是Spock和Guice的新手。我试图测试我的课程,但我不知道如何通过互动来覆盖以下的电话。

测试:

 @Shared def INSVariableResolver resolver  // just a wrapper of my injector, it's an interface                         
 @Shared def MyInterface myMock = Mock()

 def setupSpec(){
     given:
          injector = Guice.createInjector(modules)
          resolver = injector.getInstance(INSVariableResolver)
          resolver.getInstance(MyInterface.class) >> myMock  // INTERACTION
 }

 def "some test"(){
     given:
          AnotherInterface someObject = resolver.getInstance(AnotherInterface)
     expect:
          someObject.doSomething() == someValue
 }

AnotherInterface的实现:

class AnotherClass implements AnotherInterface{
     @Inject
     INSVariableResolver resolver;
     public int doSomething(){
         .
         .
         MyInterface i = resolver.getInstance(MyInterface.class);  // (*) trying to override this call
         .
         .
     }    

但它不起作用;我是标有(*)的行的真实对象,它不是模拟。我不想改变实现和AbstractModule。

有可能做我想做的事吗?我是以错误的方式使用互动吗?感谢

更新:我只需要在AnotherClass中模拟MyInterface。

1 个答案:

答案 0 :(得分:1)

你不应该用Spock嘲笑Guice,但是可以通过覆盖模块来配置Guice来注入模拟而不是真实实例。

def setupSpec(){
   injector = Guice.createInjector(Modules.override(modules).with(new Module() {
      public void configure(Binder binder) {
        binder.bind(MyInterface).toInstance(myMock)
      }
   });
 }