5

http://stackoverflow.com/questions/6645263/unit-testing-overridden-methods-which-call-super (この質問の文言は似ていますが、同じではありません)

私は次のようなものを持っています:

public class SuperClass {
   private int superClassInteger = 2;

   public void superClassMethod() {
      superClassInteger = 5;
   }

   public int getSuperClassInteger() {
      return superClassInteger();
   }
}

それから私のテストで私は持っています:

public class SuperClassTest {
   public void testSuperClassMethod() {
       SuperClass superClass = new SuperClass();
       superClass.superClassMethod();
       assertEquals(5, super.getSuperClassInteger())
   }
}

次に、サブクラスがあります。

public class SubClass {
   private int subClassInteger = 2;

   public void subClassMethod() {
      super.superClassMethod();
      subClassInteger = 32;
   }

   public int getSuperClassInteger() {
      subClassInteger;
   }
}

次に、サブクラスのテスト:

public class SubClassTest {
   public void testSubClassMethod() {
       SubClass subClass = new SubClass();
       subClass.subClassMethod();
       assertEquals(5, subclass.getSuperClassInteger());
       assertEquals(32, subclass.getSubClassInteger())
   }
}

私の問題は、サブクラスの動作をテストするために、スーパー クラスのテスト コードを繰り返していることです。assertEquals(5, subclass.getSuperClassInteger());サブクラスのビジネスロジックをテストしたいだけなので、取り出すことができます。ただし、これに関する問題は、誰かが誤ってテストへの呼び出しを削除した場合superClassMethodでも、テストに合格することです。したがって、スーパーへの呼び出しが行われたことを確認する必要があります。このユースケースをテストする一般的な方法は何ですか?

注:構成/戦略パターン対継承がこの問題の解決に役立つことは知っていますが、それが解決策であるためには、基本的に、コードでメソッドをオーバーライドしてスーパーを呼び出すべきではないと言っています(決してのために使用します)

4

3 に答える 3

5

モッキートスパイを使用します。そのテストフレームワークを使用して、ほぼすべてのメソッド呼び出しを確認できます。

http://code.google.com/p/mockito/

于 2012-12-07T11:17:19.347 に答える
1

JMockit を使用し、検証でスーパーへの呼び出しを確認します。

JMockit

この例

public void test {
  SubClass subClass = new SubClass();
  subClass.subClassMethod();
  new Verifications() {
    // mock only this method of superClass - and only in this test
    @Mocked (methods = "superClassMethod") 
    SuperClass superClass; 
    {
     superClass.superClassMethod();
     times = 1; // specify invocation count
    }
  };

 }
于 2012-12-07T11:34:48.747 に答える