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