在代码库中我有以下结构:
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.(行号)
如何达到预期效果?有没有办法实现这个测试?
答案 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);
}
}