关于使用Stubs - Java

时间:2011-04-30 15:32:04

标签: java testing stubs

我在阅读http://xunitpatterns.com/Test%20Stub.html并对存​​根的使用有一些疑问,例如,在页面上显示的代码中,作者创建了一个名为TimeProviderTestStub.java的类,用于测试代码。我对测试代码中的这一行有一些疑问:

TimeDisplay sut = new TimeDisplay();
  //      Test Double installation
  sut.setTimeProvider(tpStub);

我是否需要修改我的类(SUT)来接收一个对象TimeProviderTestSub?

1 个答案:

答案 0 :(得分:6)

存根和真实类都应该实现一些接口,即ITimeProvider,而setTimeProvider()应该将此接口作为其参数。接口必须公开SUT需要与对象交互的所有方法,因为TimeDisplay现在只能通过ITimeProvider接口使用对象(这允许我们使用存根而不是真实对象)我们的测试)。

在示例中,SUT(TimeDisplay)似乎只需要getTime()方法,因此接口应该只包含该方法:

public interface ITimeProvider {
    Calendar getTime();
}

存根的声明应该是

public class TimeProviderTestStub implements ITimeProvider { ... }

并且真实类的声明应该是

public class TimeProvider implements ITimeProvider { ... }

最后,SUT必须更改其setter方法以接受接口:

public void setTimeProvider(ITimeProvider timeProvider) { ... }

并将其内部timeProvider字段更改为ITimeProvider类型。

如果你不控制真实类的代码(这样你就不能让它实现接口),你可以创建一个包装真实类并实现接口的适配器类。