我有第三方组件我想要模拟,但它返回具有复杂层次结构的类,并且一些接口具有静态字段,这些字段由API中不可用的某些类初始化。我不需要任何隐藏课程。
样品: 假设我们想要模拟实现Combo的MutableCombo类。但是界面Combo具有由Breaker初始化的字段。 Breaker是实现包的一部分,开发人员在编译和测试期间无法访问它。
public interface Combo{
String FUU = Breaker.getFoo();
String BAR = Breaker.getBar();
}
public class MutableCombo implements Combo;
我想测试使用MutableCombo但不能模拟它的类,因为
java.lang.NoClassDefFoundError: Breaker
at Combo.<clinit>(Combo.java:36)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
答案 0 :(得分:3)
你需要一个适配器。你不应该嘲笑你不属于初学者的类型。将MutableCombo
视为实施细节。例如:
public class ExampleMutableCombo implements IExampleMutableCombo
{
public String DoFoo()
{
return Breaker.getFoo();
}
public String DoBar()
{
return Breaker.getBar();
}
}
让您的代码使用IExampleMutableCombo
。这个界面现在是你的。在生产代码中使用它。当您拥有此界面时,您可以模拟此角色 - 您可以引入一个虚假的组合进行测试,例如:
public class FakeExampleMutableCombo implements IExampleMutableCombo
{
public String DoFoo()
{
return "Foo";
}
public String DoBar()
{
return "Bar";
}
}
现在,您的所有测试都可以使用存根类,而您的生产代码可以使用ExampleMutableCombo
。关键是“编码到接口”,而不是类型。