7

テストの書き方を学ぼうとしています。私はJavaも学んでいます。jMockを学び/使用/実践する必要があると言われました.

http://www.theserverside.com/news/1365050/Using-JMock-in-Test-Driven-Development

http://jeantessier.com/SoftwareEngineering/Mocking.html#jMock

そして、私が見つけたほとんどの記事は、テスト駆動開発に関するものでした。最初にテストを書き、次にテストに合格するためのコードを書きます。現時点ではそれを探していません。jMock を使用して既存のコードのテストを作成しようとしています。

公式ドキュメントは控えめに言っても曖昧で、私には難しすぎます。誰かがこれを学ぶためのより良い方法を持っていますか? 良い本/リンク/チュートリアルは私を大いに助けてくれます. ありがとうございました

編集 - より具体的な質問:

http://jeantessier.com/SoftwareEngineering/Mocking.html#jMock - この記事から

この単純なクラスをモックするためにこれを試しました:

import java.util.Map;
    public class Cache {
        private Map<Integer, String> underlyingStorage;
        public Cache(Map<Integer, String> underlyingStorage) {
            this.underlyingStorage = underlyingStorage;
        }
        public String get(int key) {
            return underlyingStorage.get(key);
        }
        public void add(int key, String value) {
            underlyingStorage.put(key, value);
        }
        public void remove(int key) {
            underlyingStorage.remove(key);
        }
        public int size() {
            return underlyingStorage.size();
        }
        public void clear() {
            underlyingStorage.clear();
        }
    }

テスト/モックを作成しようとした方法は次のとおりです。

public class CacheTest extends TestCase {

    private Mockery context;
    private Map mockMap;
    private Cache cache;

    @Override
    @Before
    public void setUp() {
        context = new Mockery() {
            {
                setImposteriser(ClassImposteriser.INSTANCE);
            }
        };

        mockMap = context.mock(Map.class);
        cache = new Cache(mockMap);
    }

    public void testCache() {
        context.checking(new Expectations() {{
            atLeast(1).of(mockMap).size(); 
            will(returnValue(int.class));
        }});

    }
}

それはテストに合格し、基本的に何もしません。私が望んでいたのは、マップを作成してそのサイズを確認することでした。より良いトラフの例を理解してください。ここで他に何をテストできるか、または他の演習が大いに役立ちます。tnx

4

4 に答える 4

6

これは、JUnit と EasyMock の使用に関するチュートリアルです (私が個人的に JMock よりもはるかに使いやすいと思うモック ライブラリ): http://www.michaelminella.com/testing/unit-testing-with-junit-and-easymock.html

JMock の使用に 100% 専念している場合でも、両者の概念は同じであり、理解を深めるのに役立ちます。

モック化の目的は、とAに依存するClass をテストするときに、 のテストでとの実際の実装を使用するのではなく、 と のモック バージョンを使用して正確な動作を指定できるようにすることです。そうしないと、 の 1 つのユニットだけをテストしているのではなく、暗黙的にテストしていることになります。BCABCBCAABC

于 2010-05-25T14:35:36.353 に答える
3

JMock の作成者として、TDD の経験がある程度あるまで、この手法から始めません。基本から始めて、それを機能させてください。デザインのスケールと成長に困難を感じ始めたら、テクニックに戻ってください。

Dave Astels の本は今でも良い入門書であり、私が思うに、その世代でモックをよく説明している唯一の本です。その後、私たちの「Growing Object Oriented Software, Guided by Tests」を検討してください。

ファイルシステムに対するテストを高速化することがすべてだと言う人を割り引いてください。

于 2010-05-27T07:34:04.200 に答える
2

このクラスの唯一のコラボレーターは Map であるため、このクラスをテストするために実際にモックを作成する必要はありません。また、クラスは実際には何もしません (デリゲートを除く)。そのため、あまりテストしていないように感じます。

単純なテストは次のようになります(JUnit 4を使用していると仮定しています-コードはJUnit 3と4の奇妙な混合物です

@Test
public void sizeIs0WhenEmpty()
{
  Map<Integer, String> map = Collections.emptyMap();
  Cache cache = new Cache(map)
  assertEquals(0, cache.size());
}

モックではそうなるでしょう(モックコードが正しいと仮定します-私はJMockを使用しません)

@Test
public void sizeIs0WhenEmpty()
{
  context.checking(new Expectations() {{
                   atLeast(1).of(mockMap).size(); 
                   will(returnValue(0));
                   }});
  assertEquals(0, cache.size());
}

どちらの場合も、テストしたいプロパティを持つようにマップを設定してシステムをセットアップし、キャッシュが同じプロパティを持つことを確認します (これは直接のデリゲートであるため)。

続行する前に、JUnit について読むことをお勧めします。

于 2010-05-25T18:16:56.753 に答える
1

テストでモック オブジェクトを使用する方法について、皆さんがどこまで学習してきたかはわかりません。そのため、簡単な説明を書いてから、参考になる記事の方向性を示します。モック オブジェクトは単体テストで使用され、作成が難しい、またはテストに必要な状態にするのが難しい外部依存関係を置き換えます。存在するさまざまなモッキング フレームワークは、これらの依存関係に代わる「偽の」オブジェクトを作成するメカニズムを提供します。これらのモック オブジェクトは、コードからの呼び出しを追跡し、後でこれらの相互作用についてアサーションを作成できるようにします。モック オブジェクトとそれらが「スタブ」にどのように関係するかについてのよく知られた記事があります。これは、外部依存関係を単純化するためのもう 1 つの一般的なテスト戦略です。

http://martinfowler.com/articles/mocksArentStubs.html

于 2010-05-25T14:14:21.133 に答える