是否可以覆盖对注入器的调用?
Is it possible to override a call to an injector?
我是 Spock 和 Guice 的新手。我正在尝试测试我的 class,但我不知道如何通过交互覆盖下面的调用。
测试:
@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
}
另一个接口的实现:
class AnotherClass implements AnotherInterface{
@Inject
INSVariableResolver resolver;
public int doSomething(){
.
.
MyInterface i = resolver.getInstance(MyInterface.class); // (*) trying to override this call
.
.
}
但是没用; i 是标有 (*) 行的真实对象,它不是模拟对象。我不想更改实现和 AbstractModule(s)。
是否可以做我想做的事?我是否以错误的方式使用交互?谢谢
更新:我只需要在 AnotherClass 中模拟 MyInterface。
您不应该使用 Spock 模拟 Guice,但可以通过覆盖模块将 Guice 配置为注入模拟而不是真实实例。
def setupSpec(){
injector = Guice.createInjector(Modules.override(modules).with(new Module() {
public void configure(Binder binder) {
binder.bind(MyInterface).toInstance(myMock)
}
});
}
我是 Spock 和 Guice 的新手。我正在尝试测试我的 class,但我不知道如何通过交互覆盖下面的调用。
测试:
@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
}
另一个接口的实现:
class AnotherClass implements AnotherInterface{
@Inject
INSVariableResolver resolver;
public int doSomething(){
.
.
MyInterface i = resolver.getInstance(MyInterface.class); // (*) trying to override this call
.
.
}
但是没用; i 是标有 (*) 行的真实对象,它不是模拟对象。我不想更改实现和 AbstractModule(s)。
是否可以做我想做的事?我是否以错误的方式使用交互?谢谢
更新:我只需要在 AnotherClass 中模拟 MyInterface。
您不应该使用 Spock 模拟 Guice,但可以通过覆盖模块将 Guice 配置为注入模拟而不是真实实例。
def setupSpec(){
injector = Guice.createInjector(Modules.override(modules).with(new Module() {
public void configure(Binder binder) {
binder.bind(MyInterface).toInstance(myMock)
}
});
}