web-dev-qa-db-ja.com

Mockito NotaMockException

Mockito junitテストの問題に直面しています。私はそれが初めてであり、私が直面している問題に少し混乱しています。これに関する助けをいただければ幸いです。

_class Activity{

    public void firstMethod(){

      String str = secondMethod();
   }

    public String secondMethod(){
      String str = null;

      /*  some Code */

      return str;
   }
}
_

例外を取得する:

_*org.mockito.exceptions.misusing.NotAMockException: 
 Argument passed to when() is not a mock!*
_

以下のコードで

_class ActivityTest(){

  Activity act;

  @Before
  public void setup(){
     act = new Activity();
  }

  @Test
  public void testFirstMethod(){

      Mockito.doReturn(Mockito.anyString()).when(act).secondMethod();
      act.firstMethod();
      verify(act).secondMethod();
  }
} 
_

アクティビティはモックではないことは承知していますが、secondMethod()は同じクラスのメソッドであるため、これを回避する方法はわかりません。既にユニットテストを行っているので、secondMethod()のルールを記述する必要があります。 secondMethod()の定義には外部依存関係があります。 secondMethod()に存在する外部依存関係をモックし、secondMethod()のルールではなく、それらのルールを記述する必要がありますか?

この投稿を見つけました: Mockito Spy'ing on object on unit testing ただし、secondMethod()を別のクラスに分けることは意味がありません。私のメソッドはこのクラスに関連しています。テスト用に別のクラスを作成するのは適切ではないようです。すでに投稿で説明したように、spy()を使用して実際のクラスをモックすることは、最も正しい方法ではありません。

私がテストしているクラスはActivityクラスのモックを作成するべきではないと思います。私はこれに助けと洞察を本当に感謝します。

16

既に述べたように、actはモックではないため、動作を記録することはできません。 Mockito.spy を使用して、actオブジェクトをスパイ(または部分的にモック)し、secondMethodの動作のみを記録し、 firstMethodの実際のコード。

ただし、オブジェクトをdoReturningまたはmockingする方法に関係なく、spy呼び出しではマッチャーを使用できないことに注意してください。戻り値は具象オブジェクトでなければなりません。

class ActivityTest() {

  Activity act;

  @Before
  public void setup(){
     act = Mockito.spy(new Activity()); // Here!
  }

  @Test
  public void testFirstMethod(){

      Mockito.doReturn("someString").when(act).secondMethod();
      act.firstMethod();
      verify(act).secondMethod();
  }
} 

少し洗練された構文を使用すると、Mockito.spyを明示的に呼び出す代わりに注釈を使用できますが、実際には好みの問題です。

@RunWith(MockitoJUnitRunner.class)
class ActivityTest() {

  @Spy
  Activity act = new Activity();

  @Test
  public void testFirstMethod(){

      Mockito.doReturn("someString").when(act).secondMethod();
      act.firstMethod();
      verify(act).secondMethod();
  }
} 
29
Mureinik

ヒントを次に示します。

  1. アクティビティをモックします。
  2. When/then/doReturnでsecondMethodの動作を微調整します
  3. FirstMethodが呼び出されたときにdoCallRealMethodを使用します。

それが役に立てば幸い。

0
Pavan Kumar