我在阅读http://xunitpatterns.com/Test%20Stub.html并对存根的使用有一些疑问,例如,在页面上显示的代码中,作者创建了一个名为TimeProviderTestStub.java
的类,用于测试代码。我对测试代码中的这一行有一些疑问:
TimeDisplay sut = new TimeDisplay();
// Test Double installation
sut.setTimeProvider(tpStub);
我是否需要修改我的类(SUT)来接收一个对象TimeProviderTestSub?
答案 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
类型。
如果你不控制真实类的代码(这样你就不能让它实现接口),你可以创建一个包装真实类并实现接口的适配器类。