假设有一个超类
class SuperClass {
SuperClass(Foo foo) {
this.foo = foo;
}
SuperClass() {
this.foo = new DefaultFoo();
}
}
还有一个子类
class SubClass extends SuperClass {
SubClass(Foo foo) {
super(foo);
}
}
受测试的课程是SubClass
。我想验证SubClass'
构造函数确实正在调用它的超类'非空构造函数。有没有办法实现这个目标?
答案 0 :(得分:3)
我会通过超级构造函数测试这个副作用。例如它是设置特定字段还是改变行为?
请注意,您的类的实现应该完全不受测试的影响。所以你只对它如何影响构造的实体感兴趣。否则,如果/当您重构类层次结构时,您必须更改测试,而您需要它们保持不变才能执行回归。
答案 1 :(得分:1)
为了从单元测试中检查,您只需创建一个Foo
实例,将其传递给SubClass
构造函数,然后检查instance.getFoo()
是否返回完全相同的引用。
答案 2 :(得分:1)
这应该可以通过模拟超类使用jmockit(http://jmockit.googlecode.com)。这是示例
(来自:https://groups.google.com/forum/?fromgroups=#!topic/jmockit-users/O-w9VJm4xOc)
public class TestClassUnderTest {
public class ClassUnderTest extends BaseClassForClassUnderTest
{
public ClassUnderTest(ISomeInterface si)
{
super(si);
}
//...
}
@Test
public void testSuperConstructorCall()
{
final ISomeInterface si = new ISomeInterface()
{
};
Mockit.setUpMock(BaseClassForClassUnderTest.class, new Object() {
@Mock
public void $init(ISomeInterface si_param)
{
assertNotNull(si_param);
assertTrue(si_param == si);
}
});
ClassUnderTest cut = new ClassUnderTest(si);
}
}
答案 3 :(得分:0)
您可以在超类中放置一个布尔字段,并在非空构造函数中将其设置为“true”,从而在调用非空构造函数时将其设置为“true”。检查相应对象的布尔实例字段的状态,以了解调用了哪个构造函数。