Engineering Note

プログラミングなどの技術的なメモ

MockitoのdoThrowの使い方

Mockitoを利用したテスト時に、モック化したオブジェクトの例外のスローについてのメモになります。

 

 

事前準備

前回の記事で使用したコードを少し修正してデータ送信時に不正な引数があった場合に例外を投げるようにしてみます。

 

 

  • SendDataクラス:何かのデータ送信を実行し、その結果(文字列)を返す
  • SendDataServiceクラス:SendDataクラスを実行し、その文字数を返す

 

 // SendDataService.java

public class SendDataService {

    @Autowired
    private SendData sendData;    

    public int execute() {
        String result;
        try {
            result = sendData.send("foo", "bar");
        } catch (IllegalArgumentException exception) {
            result = "";
        }

        return result.length();
    }

}

 

テストコードの作成

以下が作成したテストコードとなります。

 

 // SendDataServiceTest.java

import static org.mockito.Mockito.doThrow;

public class SendDataServiceTest {
    @InjectMocks
    private SendDataService service = new SendDataService();

    @Mock
    private SendData sendData;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @After
    public void tearDown() throws Exception {
    }

    doThrow(new IllegalArgumentException()).when(sendData).send(anyString(), anyString());

    try {
        // 実行
        int result = service.execute();
        MatcherAssert.assertThat(result, CoreMatchers.is(0));
    } catch (Exception exception) {
        exception.printStackTrace();
        fail();
    }
}

 

モック化したオブジェクトであるsendDataのsendメソッドを実行した際にdoThrowメソッドで例外をスローすることができます。

構文は以下の通りとなります。

 

doThrow(RuntimeException.class).when(mock).someVoidMethod();

 

これにより例外発生時のテストも簡単に行うことができます。

 

参考書籍

Java本格入門 ~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで