1

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

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

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

4

1 回答 1

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 必须更改其设置方法以接受接口:

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

并将其内部timeProvider字段更改为 type ITimeProvider

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

于 2011-04-30T15:35:15.160 回答