0

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

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
        }
    }

}

我写了上面的方法,因为我看到了这个 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.(行号)

我怎样才能达到预期的效果?有没有办法实现这个测试?

4

2 回答 2

2

子类必须始终调用超级构造函数,无论是隐式的(这也意味着,调用

super()

在您的构造函数中是多余的)或显式(带参数)。如果您想对此进行测试,请测试可观察到的行为,即您可以测试的超级构造函数的调用会做什么。

于 2013-01-18T20:10:26.247 回答
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);
    }
}
于 2013-01-21T13:19:48.810 回答