验证验证父的特定抽象构造函数

时间:2013-01-18 20:05:14

标签: java junit abstract-class verification jmockit

在代码库中我有以下结构:

abstract class Bar{

    public Bar(){
        ....
    }

    ....        

    public Bar(int x, int y){

    }

    ....
}

Bar然后由Foo扩展。

abstract class Foo extends Bar{

    public Foo(){
      super();

        ....
    }

    public Foo(int x){
      super(x,0);  // call parent's specific constructor
      ....
    }

    ....
}

我尝试过以下jUnit测试用例,无法编译:

class FooTest{

    Foo _foo;

    @Test
    void testFooConstructor(){
        new Expectations(){
            Bar bar;
            {
                bar = new Bar(anyInt,0); // error, obviously Bar cannot be instantiated.
            }
        }

        _foo = new Foo(anyInt){ // empty implementation
            //Override any abstract methods
        }
    }

}

我已经编写了上面的方法,因为我看到了this SO question,但是抽象类可能没有被启动,因此它失败了。

此外,我也尝试过:

class FooTest{

    Foo _foo;

    @Test
    void testFooConstructor(){

        _foo = new Foo(anyInt){ // empty implementation
            //Override any abstract methods
        }

        new Expectations(){
            Bar bar;
            {
                invoke(bar,"Bar",anyInt,0); //Invocations.invoke
            }
        }

        invoke(_foo,"Foo",anyInt);
    }

}

但是,我的测试结果是:

  

java.lang.IllegalArgumentException:找不到兼容的方法:Bar(int,int)     at unit.src.com.test.FooTest $ 1.(行号)

如何达到预期效果?有没有办法实现这个测试?

2 个答案:

答案 0 :(得分:2)

子类必须始终调用超级构造函数,或者是隐式的(也就是说,调用

super()
构造函数中的

是冗余的)或显式的(带参数)。如果你想测试它,测试可观察的行为,即超级构造函数的调用会做什么,你可以测试。

答案 1 :(得分:1)

这是一个不寻常的测试场景,但可以使用JMockit和抽象基类中的构造函数使用@Mock方法来完成:

public class FooTest
{
    @Test
    void verifyCallToSuperConstructor()
    {
        new MockUp<Bar>() {
            @Mock(invocations = 1) // verifies one call will occur
            void $init(int x, int y)
            {
                assertEquals(0, y);
            }
        };

        new Foo(123);
    }
}