Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在超级构造函数中测试对象初始化?_Java_Dagger 2_Spock - Fatal编程技术网

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();