3

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

1 回答 1

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";
     }
}

现在您的所有测试都可以使用 stubbed 类,而您的生产代码可以使用ExampleMutableCombo. 关键是“编码到接口”,而不是类型。

于 2013-03-12T20:38:19.890 回答