0

私はあざけるのが初めてなので、このシナリオで遊んでいます。MyClass.process()を呼び出すメソッドがありますMyClass.getFactory()。正常に回復するgetFactory()ことを保証できるように、失敗するようにモックしたいと思います。process()

モックの後に呼び出すとgetFactory()例外が正しくスローされるようですが、元のprocess()メソッドを介して呼び出されると例外はスローされません。

public class MyClass {

    public MyFactory getFactory() throws FactoryException {
        return ...
    }

    public String process() {
        try {
            MyFactory factory = getFactory();
            ...
        }
        catch(FactoryException ex) {
            ...
        }
    }

}

テストクラス:

public class MyClassTest {

    @Test
    public void testGetFactoryFails() {
        try {
            MyClass mockMyClass = mock(MyClass.class);
            when(mockMyClass.getFactory()).thenThrow(new FactoryException());
            mockMyClass.process();
            fail("FactoryException should have been thrown.");
        }
        catch(FactoryException ex) {
            // all good
        }
    }

}

すべてのフィードバックに感謝します。より複雑な環境で単一のメソッドをモックすると、すぐに管理不能になることがわかります。getFactory() の内容は重要ではありません。これは概念コードであり、製品コードではありません。

私が試した1つの方法はうまくいきます:

public class MyClassTest {

    class MyClassMock1 extends MyClass {

        @Override
        public MyFactory getFactory() throws FactoryException {
            throw new FactoryException("Bad factory instance.");
        }

    }

    @Test
    public void testGetFactoryFails() {
        try {
            MyClassMock1 mockMyClass = new MyClassMock1();
            mockMyClass.process();
            fail("FactoryException should have been thrown.");
        }
        catch(FactoryException ex) {
            assertEquals("Bad factory instance.", ex.getMessage());
        }
    }

}
4

2 に答える 2

1

@Can't Tellがすでに言ったことを拡張します。モック ライブラリを使用して、テスト対象のクラスの依存関係をモックします。あなたの場合、テストMyClassし、テスト中にすべての依存関係 (MyClass使用するクラス) をモックする必要があります。

あるクラスの単一のメソッドをモックし、別のメソッドをテストしたいとします。これは技術的には可能かもしれませんが (ただし、さまざまなプロキシ/ラッピング メカニズムが原因で機能しません)、これは確かに悪い設計です。

あなたのgetFactory()方法を教えてください。作業全体を単独で処理する場合は、別のクラスに抽出してモックします。別のクラスに委任するだけの場合は、そのクラスをモックします。悲しいことに、この抽出されたクラスには名前が付けられます... MyFactoryFactory...

依存関係を抽出したら、それをモックして、MyClassテストの前に渡します(コンストラクター、セッターを介して...)

于 2012-09-30T14:51:36.723 に答える
0

これは、部分的なモッキングが悪いためです (それがあなたがやろうとしていることです)。それはまさにそのような問題につながります。主にレガシー システムのテスト用に導入されました。新しいコードを作成し、部分的なモッキングを使用する必要がある場合、これはおそらくシステム設計が悪いことを意味します。

getFactory呼び出しを他のサービスに委任する必要があります(に注入されMyClassます)。次に、サービス全体をモックする必要があります

于 2012-09-30T14:51:56.070 に答える