让我先说一下 - 由于害怕引入新的依赖(并且超出我的理解范围),我们不会使用mockito
或任何第三方模拟框架。
我们将ConcreteClass
作为依赖关系注入下面的class A
。 new
以后的这种依赖关系会进行ServiceProvider
查找。我在下面的method
测试期间的想法是在ConcreteClass
中模拟查找(我们有一个内部框架来执行此操作)并返回所需的提供程序,这些提供程序只是模拟提供程序类。这样,当我创建用于测试的ConcreteClass
实例时,我可以注入我的提供者。
然而,在代码审查中,建议是创建具体类的模拟子类并注入它。类似的东西:
public class MockConcreteClass extends ConcreteClass
{
public void do() { }
}
我认为这会破坏单独测试的能力,因为模拟现在直接依赖于源代码,我不觉得这样做很舒服。这是更好的方式吗?想法?
public class A
{
private final ConcreteClass b;
public A(ConcreteClass b)
{
this.b = b;
}
public void method()
{
b.do();
}
}
public class ConcreteClass
{
public ConcreteClass()
{
// Service Provider look up (can be mocked to return the desired providers)
}
public void do()
{
}
}