8

メソッド内で、モックしたい例外がキャッチされています。

mock.doSomething()を使用してオブジェクトをモックして例外をスローする方法は知っていますが、クラスがそれ自体の新しいインスタンスを作成するときにリモート例外をスローする必要があります。

transient Bicycle bike = null;

public Bicycle getBicycle() {
    if (bike == null) {
        try {
            bike = new Bicycle(this);
        } catch (RemoteException ex) {
            System.out.println("No bikes found");
        }
    }
    return bike;
}

tryブロック内のすべてをモックできるようにしたいのですが、新しいクラスの作成をどのようにモックするのかわかりません。具体的には次の行です。

bike = new Bicycle(this);

私は次のような多くの異なるMockitoテストを試しました。

Bicycle b = mock(Bicycle.class);
Mockito.doThrow(new RemoteException()).when(b = new Bicycle());

私はこれが機能することと機能しないことを理解していますが、私は同様のことをしたいと思っています。

Mockitoのドキュメントを読みましたが、役立つものは何も見つかりませんでした。

http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html

4

3 に答える 3

7

通常、コンストラクターをモックすることはありません。PowerMockのようなツールで行うことができますが、一般的にはしないことをお勧めします。

Bicycle現在、新しいものが構築されたときに何が起こるかを制御したい場合、コードは実際にはテスト可能ではありません。構築はBicycle実際には複雑な操作ですか?BicycleFactoryたとえば、依存関係としてクラスに渡すことができる、が必要な場合は、モックまたはそれを呼び出すことができますBicycleFactory.createBicycle

コンストラクターは静的メソッドのようなものです。コンストラクターを使用すると、呼び出している特定のコードに厳密にバインドされます。PowerMockのようなアプローチなしに、他の動作を注入するクリーンな方法はありません。

于 2013-03-26T21:12:45.673 に答える
3

このような場合は、Mockito拡張機能であるPowerMockを使用できます。コンストラクターをモックすることができます(https://code.google.com/p/powermock/wiki/MockConstructorを参照)。

この場合、次のようなテストを記述します。

@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassUnderTest.class, Bicycle.class})
public class ConstructorMockingTest
{
    @Test
    public void getBicycle()
    {
        ClassUnderTest tested = new ClassUnderTest();
        whenNew(Bicycle.class).withArguments(tested).thenThrow(new RemoteException());

        Bicycle bicycle = tested.getBicycle();

        assertNull(bicycle);
    }
}

その他の例は、https ://code.google.com/p/powermock/source/browse/trunk/modules/module-test/mockito/junit4/src/test/java/samples/powermockito/junit4/whennewにあります。 /WhenNewTest.java

于 2013-03-27T11:56:53.443 に答える
0

あなたgetBicycle()は今、少なくとも2つのことをします。を取得(「取得」)しBicycle、を作成しBicycleます。理想的には、メソッドまたはクラスは1つのことだけを実行し、それをうまく実行する必要があります。

オブジェクトの作成を別のメソッドに入れるcreateBicycle()か、別の方法BicycleFactoryでモックします。

于 2013-03-26T23:29:27.607 に答える