关于使用Stubs - Java

elf*_*elf 1 java testing stubs

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

TimeDisplay sut = new TimeDisplay();
  //      Test Double installation
  sut.setTimeProvider(tpStub);
Run Code Online (Sandbox Code Playgroud)

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

Aas*_*set 6

无论是存根和真正的类都应该实现一些接口,即ITimeProvidersetTimeProvider()应采取这个接口作为它的参数.接口必须公开SUT需要与对象交互的所有方法,因为TimeDisplay现在只能通过ITimeProvider接口使用对象(这允许我们在测试中使用存根而不是真实对象).

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

public interface ITimeProvider {
    Calendar getTime();
}
Run Code Online (Sandbox Code Playgroud)

存根的声明应该是

public class TimeProviderTestStub implements ITimeProvider { ... }
Run Code Online (Sandbox Code Playgroud)

并且应该是真实阶级的宣言

public class TimeProvider implements ITimeProvider { ... }
Run Code Online (Sandbox Code Playgroud)

最后,SUT必须更改其setter方法以接受接口:

public void setTimeProvider(ITimeProvider timeProvider) { ... }
Run Code Online (Sandbox Code Playgroud)

并且还将其内部timeProvider字段更改为类型ITimeProvider.

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