2

Androidアプリの単体テストにJMockitを使用しようとしています。ローカル JVM でテストを実行すると、すべての Android クラスがスタブになるため、少し注意が必要ですが、それらをモックすることはできます。それは問題ではありません。

しかし今、ResultReceiver のサブクラスであるネストされたクラスでメソッドをテストしたいと考えています。このクラスは Fragment にネストされています。問題は、このネストされたクラスを作成するときに、例外が発生するため、そのコンストラクターをモックしたいことです (これはスタブです)。コードを分離しようとしましたが、問題は Android ではなく、クラス構造にあります。例:

基本クラス:

public class JM_base {
  int m_i;

  public JM_base(int i) {
    m_i = i;
  }
}

ネストされたクラス:

public class JM_nested_class_cons {
  public class Nested extends JM_base {
    public Nested(int i) {
      super(i);
    }
    public void methodToTest() {
      System.out.print("System under test!");
    }
  }
}

テスト:

public class Test_JM_nested_class_cons {
  @Mocked JM_nested_class_cons mock;

  @Test
  public void test() {
    new MockUp<JM_nested_class_cons.Nested>() {
      @Mock public void $init(int i) {
        System.out.println("Hi!");
      }
    };

    JM_nested_class_cons.Nested t = mock.new Nested(1);
    t.methodToTest();
  }
}

私が理解している限り、Nested() の「実際の」コンストラクターは決して呼び出されるべきではなく、「こんにちは!」コンソールに表示されるはずですよね?私は何を間違っていますか?

どうも

4

1 に答える 1

3

ここでの問題は、 が通常の非内部クラスとしてMockUp扱われることです。JM_nested_class_cons.Nestedそのため、各コンストラクターに外部オブジェクト ( ) の非表示の最初のパラメーターがあることは考慮されていませんJM_nested_class_cons

回避策@Mockは、内部クラスのコンストラクターのメソッドでこの追加のパラメーターを明示的に宣言することです。

@Mock
void $init(JM_nested_class_cons outer, int i) {
    System.out.println("Hi!");
}
于 2013-11-03T14:01:12.383 に答える