存根和真实类都应该实现某个接口,即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
。
如果你不控制真实类的代码(以至于你不能让它实现接口),你可以创建一个适配器类来包装真实类并实现接口。