2011-06-24 15 views
1

easymockでこの種の動作を設定する方法がわかりません。説明するために、私は簡単な例を作成しました。 基本的に、私はvoidを返し、1つのマップを取るメソッドを持っています。そして、easymockがマップを変更して、指定したエントリを削除したいと思います。easymock set擬似オブジェクトのメソッドのパラメータに関する期待

私は、次のインタフェースを持っていると仮定します。

public interface Filter{ 
    public void filter(Map<String,String>map);  

} 

と以下のクラス:

public class MyClass { 
    private Filter filter; 
    public MyClass(Filter filter) { 
     this.filter = filter; 
    } 
    public Map<String,String> process(Map<String,String>map) { 
     filter.filter(map); 
     return map; 
    } 
} 

私はこの動作を設定する方法を見つけ出すことができませんでした:

public class MyClassTest { 

    /** 
    * Test method for {@link easy.MyClass#process(java.util.Map)}. 
    */ 
    @Test 
    public void testProcess() { 
     Map<String, String> map = new HashMap<String, String>(); 
     map.put("one","AAA"); 
     map.put("remove","BBB"); 
     map.put("three","CCC"); 
     Map<String, String> expectedRet = new HashMap<String, String>(); 
     expectedRet.put("one","AAA"); 
     expectedRet.put("three","CCC"); 


     IMocksControl mockery = EasyMock.createControl(); 
     mockery.resetToStrict(); 
     mockery.checkOrder(true); 

     Filter mockFilter = mockery.createMock("filter", Filter.class); 
     MyClass m = new MyClass(mockFilter); 
     mockFilter.filter(map); 
     // I would like some behaviour that will remove the entry ("remove","BBB") 
     // how can I define that? 

     mockery.replay(); 
     m.process(map);   
     mockery.verify(); 

     assertEquals(expectedRet,map); 

    } 

} 

答えて

0

あなたはm.process(map)は模擬の上にfilter(map)と呼ぶことになるはずですフィルタ:

Filter mockFilter = mockery.createMock("filter", Filter.class); 

    // set expectation 
    mockFilter.filter(map); 
    replay(mockFilter); 

    MyClass m = new MyClass(mockFilter); 
    m.process(map); 

    // verify expectation 
    verify(mockFilter); 

上記の抜粋コードで使用したパスは、模擬フィルタを確認しようとしています。それはあなたのテストの目的であってはなりません。あなたのケースでテストするクラスはFilterではなくMyClassです。

更新:あなたのモックに動作を追加することができます

expect(mockFilter.filter(map)).andDelegateTo(new Filter { 
    @Override 
    void filter(Map<String, String> map) { 
     map.remove("remove"); 
    } 
}); 

しかし、あなたの特定のケースでFilterインタフェースは最初の場所でモックFilterを使用する目的は、andDelegateToを引き起こすのに十分なシンプルなビートであります。私は、メソッドと呼ばれるプロセスを持っていないの1- mockFilter(地図<文字列、文字列私はあなたのポイントを得ることはよく分からない

class TestFilter implements Filter { 
    @Override 
    void filter(Map<String, String> map) { 
     map.remove("remove"); 
    } 
} 

MyClass m = new MyClass(new TestFilter()); 
m.process(map); 
assertNull(map.get("remove")); 
+0

:コードの同じ量では、あなたのテストでは、具体的なFilterインスタンスを使用することができます>)、次に2 - あなたは、地図がエントリーをストライプする必要があるという期待をどこに設定しますか?どうぞお分かりですか? – Charbel

+0

@Charbel:(1)私の間違い。私は 'filter(map)'の代わりに 'process(map)'を書いて、期待値を設定しました。模倣された 'Filter'オブジェクトは' filter'メソッドを持ちます。 (2)それは事です。フィルターが最終的にエントリーを取り除くという期待を設定する必要はありません。これは、テスト対象のクラスが「フィルタ」である別のテストの懸念事項です。このテストでは、MyClassをテストしています。テストは、理想的には一度に1つに集中する必要があります。 –

+0

基本的には、フィルタによって返される地図があればそれをテストしたいと思っています。 MyClass.processはそれを変更しません。 – Charbel

関連する問題