web-dev-qa-db-ja.com

Mockitoを使用して別のクラス内のクラスメソッドをモックする

私はこのような機能のためにMockito/JUnitでユニットテストを書き込もうとしています:

class1 {
 method {
  object1 = class2.method // method that I want to fake the return value
  // some code that I still want to run
 }
}

Mockitoにclass2.methodの結果をスタブする方法はありますか?クラス1のコードカバレッジを改善しようとしているので、実際のプロダクションメソッドを呼び出す必要があります。

スパイメソッドでMockito APIを調べましたが、これはメソッド全体を上書きし、必要な部分を上書きしません。

11
Chang Liu

私はあなたの質問を理解していると思います。言い換えると、テストしようとしている関数があり、その関数内で呼び出された関数の結果を、別のクラスでモックしたい場合があります。私はそれを次のように処理しました。

public MyUnitTest {
    private static final MyClass2 class2 = mock(MyClass2.class);

    @Begin
    public void setupTests() {
        when(class2.get(1000)).thenReturn(new User(1000, "John"));
        when(class2.validateObject(anyObj()).thenReturn(true);
    }

    @Test
    public void testFunctionCall() {
        String out = myClass.functionCall();
        assertThat(out).isEqualTo("Output");
    }
}

これは、@ Beforeアノテーションでラップされた関数内で、特定の入力が与えられたときにclass2の関数がどのように応答するかを設定しているということです。次に、実際のテスト内から、テストしたいクラスでテストしようとしている関数を呼び出しています。この場合、myClass.functionCall()は通常どおり実行され、そのメソッドを上書きすることはありませんが、MyClass2内のメソッド(またはメソッド)から取得する出力をモックしています。

4
John Brumbaugh

これは私のために働いた:

public class Class1Test {

  Class1 class1;

  @Before
  public void setUp() {
    MockitoAnnotations.initMocks(this);
    class1 = new Class1();
  }

  @Test
  public void testClass1Method() {

    Class2 class2 = Mockito.mock(Class2.class);
    class1.setClass2(class2);
    Mockito.when(
            class2.class2Method(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenReturn("some response");

    String actualResponse = class1
            .class1Method("12345", "3333", "4444");
    assertEquals("some response", actualResponse);
  }
}
2
krku

私はうまく動作する簡単な例を書いた、それが役立つことを願っています:

class1のmethod1()はClass2のmethod2()を呼び出します。

    public class Class1 {
        private Class2 class2 = new Class2();
        public int method1() {
            return class2.method2();
        }
    }

Class2およびmethod2():

    public class Class2 {
        public int method2() {
            return 5;
        }
    }

そしてテスト:

    import org.junit.Rule;
    import org.junit.Test;
    import org.mockito.InjectMocks;
    import org.mockito.Mock;
    import org.mockito.junit.MockitoJUnit;
    import org.mockito.junit.MockitoRule;

    import static org.junit.Assert.assertEquals;
    import static org.mockito.Mockito.when;

    public class TestClass1 {

        @Mock
        Class2 class2;

        @InjectMocks
        Class1 class1;

        @Rule
        public MockitoRule mockitoRule = MockitoJUnit.rule();

        @Test
        public void testMethod1(){
            when(class2.method2()).thenReturn(29);
            assertEquals(29,class1.method1());
        }
    }
0
Mori