1

mockitoを使用してメソッドをモックすると、モックされたメソッドが呼び出されないことが保証されますか? 単体テストを作成したいコードを含む Main クラスがあり、 Main クラスの単体テストを含む単体テスト クラス MainTest が 1 つあります。

例えば:

ソース クラス:

package abc;

public class Main {

    public int check1() {
        int num = 10;
        num = modify(num);
        return num;
    }

    public int modify(int num) {
        if (num % 10 == 0) return num / 10;
        return -1;
    }
}

Junit テスト (mockito を使用)

package abc;

import junit.framework.Assert;

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

public class MainTest {

    private static Main main;

    @BeforeClass
    public static void setUp() {
        main = Mockito.mock(Main.class);
        Mockito.when(main.modify(10)).thenReturn(5);
    }

    @Test
    public void testCheck1() {
        Test1 main1 = new Main();
        int num = main.check1();
        Assert.assertEquals(5, num);
    }
}

このテストは失敗しています。なんで?

4

3 に答える 3

8

EDITED の動作を提供しなかったためですcheck1()すべてのメソッドがモックされるため、動作を指定しないcheck1()と、int の戻り値の型のデフォルト値である 0 が返さcheck1()れますmodify()

クラスをテストしようとしている場合は、テスト対象のクラスを決してモックしないでください。まれに、テスト対象のクラスをスパイする必要がある場合があります。むしろ、コラボレーターのみを嘲笑します。

あなたの例は不自然なものだったと思います(願っています)。しかし、内部メソッドの動作を変更したいと考えているクラスを作成してテストしている場合は、次の 2 つの可能性が考えられます。

  1. コラボレーター クラスにモックアウトするメソッドの機能をリファクタリングする必要がある場合があります。次に、協力者としてその行動を模倣することは理にかなっています。
  2. 変更内容を渡すことができるように、API を変更する必要がある場合もあります。あなたの場合、check1()に渡す値をハードコーディングします。modify()これが、 をモックしようとしている理由ですmodify()。代わりに、その値がcheck1()class のパラメーターまたは設定可能なフィールドでMainある場合、モックを使用する必要さえありません。
于 2012-05-29T14:31:29.627 に答える
4

テストの問題は、新しく作成した main1 オブジェクトを使用しないことです。

テスト対象のシステム (SUT) の動作を変更する場合は、通常、次のようにします。

@Test
public void testCheck1() {
    Test1 main1 = new Main(){
        public int modify(int num) {
            return 5; // hard coded return value
        }
    };
    int num = main1.check1();
    Assert.assertEquals(5, num);
}

これにより、変更メソッドの新しい実装を持つ Main のサブクラスが作成されます。これは、SUT 内のテストが難しいメソッドを置き換えるための重要な手法です。通常は、高価なリモート呼び出しなどを避けるために使用します。

もちろん、次のように Mockito スパイを使用することもできます。

@Test
public void testCheck1() {
    Test1 main1 = spy(new Main());
    stub(main1.modify(10)).toReturn(5);

    int num = main1.check1();
    Assert.assertEquals(5, num);
}
于 2012-05-29T15:08:36.043 に答える
0

遅くなりましたが、誰かの役に立つかもしれません。@VivaceVivoの回答に追加するだけです:スパイを使用する場合は、スタブ用のメソッドの doReturn|Answer|Throw() ファミリーを検討してください。スパイのスタブ化に when(Object) を使用することが不可能または非現実的である場合があります。詳細はこちら

于 2016-09-08T20:32:47.067 に答える