关于使用Stubs-Java

关于使用Stubs-Java,java,testing,stubs,Java,Testing,Stubs,我正在阅读并对存根的使用有一些疑问,例如,在页面上显示的代码中,作者创建了一个名为TimeProviderTestStub.java的类,用于测试代码。我对测试代码中的这一行有一些疑问: TimeDisplay sut = new TimeDisplay(); // Test Double installation sut.setTimeProvider(tpStub); 我是否需要修改我的类(SUT)以接收一个对象TimeProviderTestSub 存根和实类都应该实现

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

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

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

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

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

public interface ITimeProvider {
    Calendar getTime();
}
存根的声明应该是

public class TimeProviderTestStub implements ITimeProvider { ... }
public class TimeProvider implements ITimeProvider { ... }
真实类的声明应该是

public class TimeProviderTestStub implements ITimeProvider { ... }
public class TimeProvider implements ITimeProvider { ... }
最后,SUT必须更改其setter方法以接受接口:

public void setTimeProvider(ITimeProvider timeProvider) { ... }
并将其内部
timeProvider
字段更改为
ITimeProvider
类型


如果您不控制实际类的代码(因此您无法使其实现接口),则可以创建一个适配器类来包装实际类并实现接口。

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

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

public interface ITimeProvider {
    Calendar getTime();
}
存根的声明应该是

public class TimeProviderTestStub implements ITimeProvider { ... }
public class TimeProvider implements ITimeProvider { ... }
真实类的声明应该是

public class TimeProviderTestStub implements ITimeProvider { ... }
public class TimeProvider implements ITimeProvider { ... }
最后,SUT必须更改其setter方法以接受接口:

public void setTimeProvider(ITimeProvider timeProvider) { ... }
并将其内部
timeProvider
字段更改为
ITimeProvider
类型


如果您不控制实际类的代码(因此无法使其实现接口),则可以创建一个适配器类,该类封装实际类并实现接口。

Nice,谢谢,因此:此接口将有两种方法?对于setTimeProvider,一个用于存根,一个用于真实对象?@user428691:本文应该提供类声明;那会让一切变得更清楚。看到我最后的编辑。很好,谢谢,所以:这个界面将有两种方法?对于setTimeProvider,一个用于存根,一个用于真实对象?@user428691:本文应该提供类声明;那会让一切变得更清楚。请参阅我的上一次编辑。