Mock类缺少依赖项

时间:2013-02-28 08:23:56

标签: java mocking

我有第三方组件我想要模拟,但它返回具有复杂层次结构的类,并且一些接口具有静态字段,这些字段由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)

1 个答案:

答案 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。关键是“编码到接口”,而不是类型。