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: 互換性のあるメソッドが見つかりません: unit.src.com.test.FooTest$1 の Bar(int,int).(行番号)

どうすれば望ましい結果を得ることができますか? このテストを実装する方法はありますか?

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 に答える