2016-02-25 35 views
1

我是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(s)。

是否可以做我想做的事情?我是否以错误的方式使用互动?谢谢

更新:我只需要在AnotherClass里面的MyInterface模拟。

回答

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) 
     } 
    }); 
} 
+0

我试图避免这个选项,因为MyInterface是在应用程序的几个类中注入的。我只需要在AnotherClass里面模拟一下。 – jcremona

+0

为什么不在创建后在AnotherClass上设置字段? –

+0

我嘲笑了解析器并在AnotherClass上设置了字段(解析器)。谢谢。 – jcremona