2

質問: (jmock、mockito、または簡単なモックを使用して) スタブまたはモック オブジェクト応答を自動化するツールはありますか?

Amazon AWS サービス (SQS/Simple Queue Service、および DynamoDB) に依存するメソッドに対して単体テストを作成する必要があります。モック オブジェクトの応答をスタブ化することは、非常に面倒で、維持するのが難しい傾向があります。そこで、Java プロキシ (CGLib または javassist 経由) を使用して、スタブ化された応答を記録および再生するとよいと考えました。このようなアイデアを自分で実装しようと考えましたが、そのようなアイデアを実装したことがある人がいるかどうかを確認したいと思います。

4

3 に答える 3

1

これを完全に行うことはお勧めしません。自分が所有していないライブラリをあざけることは、(すでにおわかりのように) 問題を起こすだけであり、自分がそうあるべきだと思う方法でライブラリを操作していることを確認するだけです。

SQS/DynamoDb と対話するコードがある場合は、実際に SQS と DynamoDb をヒットする統合テストを作成します。単体テストよりもはるかに高いレベルの信頼性が得られ、脆弱ではありません。DynamoDb には、この目的のためだけにスピンアップできるインメモリ ローカル インスタンスもあります。

于 2013-10-14T22:59:40.730 に答える
1

easymock は昔はまさにそれを行っていましたが、そのようなテストはコードが変更されると脆弱になる傾向があることがわかりました。私の経験では、テストでスタブを維持するのが面倒な場合、それは耳を傾けるべきテスト済みコードの設計の手がかりになります。そこにはおそらくもっと小さなオブジェクトがあるはずです。

于 2013-04-27T10:48:06.260 に答える
0

私は同じ機能について考え、CGLib を直接ではなく、Mockito フレームワークを介して自分で実装することになりました。Mockito を Android で使用するツールを簡単に移植できるように、誰かが Android Java プラットフォームで Mockito を有効にしたと聞きました。しかし、私の知る限り、現時点では CGLib や Javaassit に依存する機能を移植することはできません。

2 つのモードを持つ「 bimock」(双方向モック)という名前のツールをオープンソース化しました。記録モードでは、メソッド呼び出しと戻り値または例外を JSON 形式のリソース ファイルに記録します。再生モードでは、起動時にリソース ファイルからメソッド呼び出しと応答を設定し、リターンまたはスローの応答を再生します。Java オブジェクトのパブリック メソッドの応答を記録し、JSON ファイルから再生するこの例を参照してください。

このツールは、Amazon AWS SDK オブジェクトだけでなく、HashMap、ArrayList、ByteBuffer などの JDK オブジェクトに対するさまざまな依存関係に対しても使用できるはずです。

public class BimockTest {
    private Mode mode = Mode.Replay;
    private PojoMapper pojoMapper = new PojoMapper(new BimockModule());
    private Bimock bimock = new Bimock(pojoMapper);

    @Test
    public void testRecordAndReplayMap() throws IOException {
        val map = bimock.of(new HashMap<String, Integer>(), mode, new File("src/test/resources/test-record-and-replay-map.json"));
        assertThat(map.put("abc", 3), equalTo(null));
        assertThat(map.size(), equalTo(1));
        assertThat(map.get("abc"), equalTo(3));
    }

    @Test
    public void testRecordAndReplayList() {
        List<Long> list = new ArrayList<Long>();
        list = bimock.of(list, mode, new File("src/test/resources/test-record-and-replay-list.json"));
        try {
            assertThat(list.remove(-1), nullValue());
            fail();
        } catch (ArrayIndexOutOfBoundsException e) {
            assertThat(e.getMessage(), equalTo("-1"));
        }
        assertThat(list.add(100L), equalTo(true));
        assertThat(list.toArray(new Long[1]), equalTo(new Long[] { 100L }));
    }
}
于 2013-04-23T19:37:43.990 に答える