【发布时间】:2016-04-03 10:40:12
【问题描述】:
我的问题是关于测试一个实现许多接口的类。比如我有这个类:
public class ServiceControllerImpl extends ServiceController implements IDataChanged, IEventChanged {
}
现在有两种测试方法。第一种是直接在具体类上进行测试。这意味着对象类型是具体的类而不是接口。
public class ServiceControllerImplTest {
ServiceControllerImpl instance;
@Before
public void setUp() {
instance = new ServiceControllerImpl();
// you can bring this instance anywhere
}
}
第二种方法是只在接口上测试。我们必须将此对象类型转换为它实现的所有接口。
public class ServiceControllerImplTest {
ServiceController instance; // use interface here
IDataChanged dataChangeListener;
@Before
public void setUp() {
instance = new ServiceControllerImpl();
dataChangeListener = (IDataChanged) instance;
// instance and dataChangeListener "look like" two different object.
}
}
我更喜欢第二种解决方案,因为也许将来我们可以将它实现的接口更改为其他对象,因此使用具体类可能会导致将来测试失败。我不知道这个问题的最佳实践。
谢谢:)
【问题讨论】:
-
是的,用于测试您在接口类型上测试的接口。所以你的第二个解决方案基本上是要走的路。
-
我相信上面的评论给出了答案,但你的问题需要稍微澄清一下。当您写
dataChangeListener = (IDataChanged) dataChangeListener;时,您的意思是dataChangeListener = (IDataChanged) instance;,对吧? -
@DaveSchweisguth 是的。我编辑了。非常感谢。
-
这两种实现之间没有什么可以选择的。注意
ServiceController不是接口。这是一个基类。 -
该参数适用于任何超类型,无论是接口还是超类。
标签: java unit-testing testing interface