7

私は次の構造を持っています:

class Bar{
  ....
  protected void restore(){
    ....
  }

  ....
}

このクラスは次のように拡張さFooれます。

class Foo extends Bar{
    ....

    @Override
    public void restore(){  //valid override
        super.restore();

        ....
    }
}

foo.restore()私のjUnitテストでは、が呼び出されると、その後にが呼び出されることをテストしたいと思いsuper.restore()ます。したがって、以下は私のjUnitテストメソッドです。

class FooTest{
  @Tested
  Foo _foo;

  @Test
  void testRestore(final Bar bar){

    new Expectations(){{
      bar.restore(); times = 1; // Error! bar.restore() not visible
    }};

    Deencapsulation.invoke(_foo,"restore");
  }
}

残念ながら、私のテストはコンパイルできません。その理由は、1)restore()親のがprotectedと2)FooTestでありFoo、別々のプロジェクト(したがってフォルダー)と。に一緒に存在するためですBar

とにかく希望のテストを達成するためにありますか?私はjMockitチュートリアルをチェックしましたが(過去数か月に何度も)、同様のテストは見ていません(Googleでの検索でも同じことが言えます)。


アップデート

応答の助けを借りて、サブクラスを強制的に呼び出すことsuperはベストプラクティスではないことを理解していますが、これは私の実装ではなく、テストする必要があります。親への呼び出しが行われているかどうかを確認するためにjUnitテストを実施する方法をまだ探しています。

4

3 に答える 3

4

それで、基本的にあなたはスーパーを呼び出してサブクラス化を許可しようとする契約を強制しようとしていますか?Javaでの動作を隠す動的ディスパッチのため、これは簡単にはできないと思います。モッキングがこれを捕まえるとは思わない。

スーパーが呼び出されるようにする方法は、スーパーと拡張機能を次のような2つのメソッドに分割することです。

class Foo {
  public final void restore() {
    //parent code...
    doRestore();
  }

  protected void doRestore() {
    //empty base implementation
  }
}

class Bar extends Foo {
    protected void doRestore() {
      //do my subclass specific restore stuff here
    } 
}
于 2013-01-11T20:50:59.407 に答える
2

次のテストが機能するはずです。

public class FooTest
{
    @Tested Foo _foo;

    @Test
    void restoreInFooCallsSuper(@Mocked final Bar bar)
    {
        new Expectations() {{
            invoke(bar, "restore");
        }};

        _foo.restore();
    }
}
于 2013-01-15T15:03:45.777 に答える
1

super.restore()何か役に立つことをすることになっていますか?いくつかの特定のロジック。テストでは、呼び出しの結果が発生したことをテストするだけsuper.restore()です。

それを調べる別の方法は次のとおりです。サブクラスでは、何かを実行する前に、スーパーが正しく機能するassertことを保証するを実装します。これはより強力なチェックであり、契約によるマイヤーの設計パラダイムの一部としてよく知られています。このコンテキストでは、サブクラスはsuper.restore()実行前に実装の事後条件が保持されていることを確認するだけであり、assert単体テスト中だけでなく、アプリケーションのテスト統合実行中にも失敗することがわかっています。

class Foo extends Bar{
    ....

    @Override
    public void restore(){  //valid override
        super.restore();
        assert super_restore_worked_ok_condition : "restore post-condition failed";

        ....
    }
}
于 2013-01-11T20:47:13.403 に答える