2011-04-30 40 views
0

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

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

我需要修改我的课(SUT)以收到一个对象TimeProviderTestSub?

回答

6

存根和实际类都应该实现某个接口,即ITimeProvidersetTimeProvider()应该将此接口作为其参数。界面必须公开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字段是类型ITimeProvider的。

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

+0

不错,谢谢,所以: 这个接口有两种方法吗? setTimeProvider一个用于存根,一个用于真正的obj? – elf 2011-04-30 15:43:06

+0

@ user428691:文章应该提供了类声明;这会让所有事情变得更清晰。看我最后的编辑。 – 2011-04-30 15:54:11

+0

Eldhuset非常好,很好,谢谢。 – elf 2011-04-30 16:05:13