私は今までJMockitを使用しておりました。  
とくに、試験対象のメソッド内で呼ばれる別のクラスをmock化し、「２回目でExceptionを発生させる」などの使用方法でつかってました。

JMockitを使用した以下のソースコードは正常に動作します。

```

    public class TestClass{
    
     @Test
     public void test01(@Mocked TargetSubClass mock){
        
        //Arrange
        new Expecteions(){{
          mock.someMethod((String[])any);
          result = new Object[]{ null , new NullPointerException } //２回目でException発生
        }}
    
    　  //Act
        Target target = new Target();
        target.targetMethod(); //ここでNullPointerExceptionが発生（期待通り）
    
    　　//Assert
        /* 本来はここでExceptionが発生することを確認・略  */
    
     }
    }
    
```

しかし、環境の問題でJMockitの代わりにMockitoを使用せざる得ない状況になりました。  
同じテストをするために、私が試したコードは以下です。

Mockitoを使用した以下のソースコードは正常に動作しません。

```

    public class TestClass{
    
     @Test
     public void test01(){
        
        //Arrange
        TargetSubClass mock = mock(TargetSubClass.class);
        dothrow(new NullPointerException()).when(mock).someMethod(any()); //本来は２回目で出したいが１回目でも失敗
    
    　  //Act
        Target target = new Target();
        target.targetMethod(); //ここでExceptionが発生しない
    
    　　//Assert
        /* 本来はここでExceptionが発生することを確認・略  */
    
     }
    }
    
```

どなたか、解決方法をご存じないでしょうか。  
ご助言よろしくお願いいたします。
CC BY-SA 4.0
2020-07-10T05:51:40.397
68461
2020-08-04T17:53:47.490
41033
question
java mockito jmockit
JMockitからMockitにスイッチする場合の疑問
質問文中のコードが実際に何をやりたいものなのか理解できていませんが、

  * [10\. Stubbing consecutive calls (iterator-style stubbing)](https://www.javadoc.io/static/org.mockito/mockito-core/2.10.0/org/mockito/Mockito.html#10)

が該当するものだと思います。

```

    when(mock.someMethod(any()))
        .thenReturn(null)
        .thenThrow(new NullPointerException());
    
```

戻り値が `void` のメソッドに対しては次のようになります。

  * [Stubbing consecutive calls on a void method](https://www.javadoc.io/static/org.mockito/mockito-core/2.10.0/org/mockito/Mockito.html#doNothing--)

```

    doNothing().doThrow(new NullPointerException())
        .when(mock).someMethod(any());
    
    
```
CC BY-SA 4.0
2020-07-10T20:09:20.637
68483
2020-08-04T17:53:47.490
2020-08-04T17:53:47.490
2808
2808
68461
answer