Java 如何监视注入的单身汉?

Java 如何监视注入的单身汉?,java,unit-testing,dependency-injection,playframework-2.0,singleton,Java,Unit Testing,Dependency Injection,Playframework 2.0,Singleton,我在一个模型类中有一个验证方法,该方法从我无法控制的代码中调用。此验证方法具有来自依赖项注入的参数。其中一个参数是singleton(@singleton)类 但是是的,spy只返回一个副本,因此不会监视实例化的单例。我需要用spycopy替换singleton实例,使其以这种方式工作 我该怎么做 测试用例的进一步解释: 在我的测试中(测试中的方法是register()),我通过play框架的内置功能将scala.html视图表单绑定到模型类 public Result register()

我在一个模型类中有一个验证方法,该方法从我无法控制的代码中调用。此验证方法具有来自依赖项注入的参数。其中一个参数是singleton(
@singleton
)类

但是是的,
spy
只返回一个副本,因此不会监视实例化的单例。我需要用
spy
copy替换singleton实例,使其以这种方式工作

我该怎么做


测试用例的进一步解释:

在我的测试中(测试中的方法是
register()
),我通过play框架的内置功能将scala.html视图表单绑定到模型类

public Result register() throws ResultMessageException {
    ...
    Form<Registration> filledRegistrationForm = this.formFactory.form(Registration.class).bindFromRequest();
    ...
}
public Result register()抛出ResultMessageException{
...
Form Filled RegistrationForm=this.formFactory.Form(Registration.class).bindFromRequest();
...
}
该模型有一个验证方法,该方法具有按照播放文档中所述注入的参数:

@ValidateWithDI
公共类注册实现ValidatableWithDI{
@必需的
私有字符串对象;
@凌驾
公共验证错误验证(ObjValidation ObjValidation){
如果(!objValidation.exists(obj)){
返回新的ValidationError(“obj”);
}
返回null;
}
}

绑定表单时,框架将调用此验证方法。

显式传入spy。在单元测试期间,您不应该使用DI框架(仅限)。您说的“传入”是什么意思?我无法传递它,因为我无法控制传递依赖注入单例的调用方。在您的单元测试中,您可以完全控制传递到被测单元的依赖项。我不确定我是否理解您的意思,或者我们是否误解了彼此。你能进一步解释一下吗?你可以在这里引用:明确地传递间谍。在单元测试期间,您不应该使用DI框架(仅限)。您说的“传入”是什么意思?我无法传递它,因为我无法控制传递依赖注入单例的调用方。在您的单元测试中,您可以完全控制传递到被测单元的依赖项。我不确定我是否理解您的意思,或者我们是否误解了彼此。你能进一步解释一下吗?你可以参考这里:
ObjValidation objValidation = spy(app.injector().instanceOf(ObjValidation.class));
doReturn(true).when(objValidation).exists(any());
public Result register() throws ResultMessageException {
    ...
    Form<Registration> filledRegistrationForm = this.formFactory.form(Registration.class).bindFromRequest();
    ...
}
@ValidateWithDI
public class Registration implements ValidatableWithDI<ValidationError> {

    @Required
    private String obj;

    @Override
    public ValidationError validate(ObjValidation objValidation) {
        if (!objValidation.exists(obj)) {
            return new ValidationError("obj");
        }
        return null;
    }
}