Mockitoのspyと例外(解決編)

概要

spy()で作成したインスタンスに対して、本来例外が発生するパターンでwhen().thenReturn()を用いてモックを定義しようとすると本来の例外が発生してしまいテストができない。 これを回避するためにはdoReturn()を使えばよい。

検証

環境

  • Java8
  • powermock-mockito2-junit-1.7.1
    • junit-4.12
    • mockito 2.8.9
    • powermock 1.7.1

ソースコード

前回と同じTargetクラスを使用

テストコード

package kurukuruz.test.mock;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.Test;
import org.mockito.Mockito;

public class TargetTest2 {

    // Mockito.when実行時に例外が発生するパターン
    @Test(expected=IllegalStateException.class)
    public void Mockito_spy_thenReturn() {
        Target t = Mockito.spy(Target.class);
        Mockito.when(t.method1("hoge")).thenReturn("mock");

        t.method1("hoge");
    }

    // 意図通りにモック化するパターン
    @Test
    public void Mockito_spy_doReturn1() {
        Target t = Mockito.spy(Target.class);
        Mockito.doReturn("mock").when(t).method1("hoge");

        String actual = t.method1("hoge");
        assertThat(actual, is("mock"));
    }

    // spy対象外の引数なので実コードを実行し例外発生
    @Test(expected=IllegalStateException.class)
    public void Mockito_spy_doReturn2() {
        Target t = Mockito.spy(Target.class);
        Mockito.doReturn("mock").when(t).method1("hoge");

        t.method1("bar");
    }
}

参考サイト