如何验证是否正在调用超类的构造函数

时间:2012-10-10 08:11:01

标签: java unit-testing

假设有一个超类

class SuperClass {
    SuperClass(Foo foo) {
        this.foo = foo;
    }

    SuperClass() {
        this.foo = new DefaultFoo();
    }
}

还有一个子类

class SubClass extends SuperClass {
     SubClass(Foo foo) {
        super(foo);
    }
}

受测试的课程是SubClass。我想验证SubClass'构造函数确实正在调用它的超类'非空构造函数。有没有办法实现这个目标?

4 个答案:

答案 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”。检查相应对象的布尔实例字段的状态,以了解调用了哪个构造函数。