Java 如何在超级构造函数中测试对象初始化?
我有一个Java 如何在超级构造函数中测试对象初始化?,java,dagger-2,spock,Java,Dagger 2,Spock,我有一个BasePersister,它使用Dagger在其构造函数中构建一个复杂的持久性客户端: public abstract class BasePersister { @Getter private PersistenceClient client; public BasePersister() { this.client = DaggerPersistenceClientComponent.create().getClient(); } pu
BasePersister
,它使用Dagger在其构造函数中构建一个复杂的持久性客户端:
public abstract class BasePersister {
@Getter
private PersistenceClient client;
public BasePersister() {
this.client = DaggerPersistenceClientComponent.create().getClient();
}
public abstract void persist(String data);
protected void helper() {
System.out.println("I am a helper");
}
}
其思想是,子持久化器类只需扩展基类并使用客户端执行其持久化逻辑。一个示例子类:
public class SpecialPersister extends BasePersister {
public void persist(String data) {
// do stuff with the client
getClient().persist(data);
// use the shared helper
helper();
}
}
在基类构造函数中移动客户机实例化非常理想,因为在我的PersisterFactory
中,我可以简单地调用new SpecialPersister()
之类的语句;构造函数不接受任何参数,不需要Dagger来实例化,工厂完全不知道有任何客户端
我在测试这些子类时遇到了问题,我怀疑这与我的设计选择有关,即在基构造函数中秘密实例化客户机
更具体地说,在我的SpecialPersisterTest
类中,我不能执行Spy(SpecialPersister)
,因为这会调用基本构造函数,然后它会实例化我的复杂客户端(给我一个错误)。我需要模拟这个超级构造函数调用,这样它就不会真正调用客户端实例化,因为客户端实例化有复杂的网络调用等
理想情况下,我可以做一个简单的测试,例如检查:
def "my ideal test"() {
given:
specialPersister.persist(validData)
then:
1 * specialPersister.getClient()
and:
1 * specialPersister.helper()
}
在基类构造函数中移动客户机实例化非常理想,因为在我的PersisterFactory
中,我可以简单地调用newspecialpersister()之类的语句代码>构造函数不接受任何参数,不需要Dagger来实例化,工厂完全不知道有任何客户端
我在测试这些子类时遇到了问题,我怀疑这与我的设计选择有关,即在基构造函数中秘密实例化客户机
这个设计选择就是问题所在。如果您希望代码能够在不调用真实客户机的情况下进行测试,则需要能够对客户机进行存根。其中一个选项是在实例化时传入PersistenceClient
因为您使用的是工厂模式,所以工厂可以提供它,而不必担心代码中其他地方的细节。它应该知道如何创建持久化对象,而不管它是否需要知道关于客户机耦合的细节,应该鼓励在这个级别上进行耦合。您可能还希望您的工厂也接受该参数,以便可以测试工厂中的持久化程序
公共抽象类BasePersister{
私人客户;
公共BasePersister(PersistenceClient客户端){
this.client=client;
}
}
公共类SpecialPersister扩展了BasePersister{
公共专用Persister(PersistenceClient){
超级(客户);
}
}
公共类PersisterFactory{
//将客户端传入一次到PersisterFactory实例
私人客户;
公共PersisterFactory(PersistenceClient客户端){
this.client=client;
}
公共SpecialPersister createSpecialPersister(){
返回新的SpecialPersister(客户端);
}
}
//别处
PersisterFactory PersisterFactory=新的PersisterFactory(DaggerPersistenceClientComponent.create().getClient());
// ...
BasePersister persister=persisterFactory.createSpecialPersister();