2017-05-22 5 views
2

私はやや複雑な状況があり、対処方法がわかりません。プライベート変数マップを持つオブジェクトがあります(オブジェクトは既に初期化されています)。このクラスはマップ上で一連の操作を行います。ユニットテストMockito、スパイ、Mapオブジェクトのリフレクション

私は単体テストを書く必要があります。それはプライベート変数を取得し、それを模擬(またはスパイ)し、いくつかの操作を実行し、操作の順序を検証します。最善の方法は何ですか?

public class A{ 
    private Map<String, String> map = new Map()<>; 

    public void method1(){ 
    map.put("a", "A"); 
    }  

    public void method2(){ 
    if(map.size() > 0){ 
     map.put("b", "B"); 
    } 

} 
... 
public class UnitTester{ 
@Test 
public void test(){ 
    A ainstance = new A(); 
    Map<String,String> mock = mock(Map.class); //OR Map<String,String> mock = spy(Map.class); 

    Field f= A.class.getDeclaredField("map"); 
    f.setAccessible(true); 
    f.set(ainstance, mock); 

    ainstance.method1(); 
    ainstance.method2(); 

    InOrder inOrder = inOrder(mock); 
    inOrder.verify(mock, times(2), put(anyString(), anyString())); //Does not work 

} 

map.put地図には何も追加されません。これが反射オブジェクトなのか、それとも別の原因があるのか​​分かりません。

答えて

3

手動で反射を使用する代わりに、アノテーションを利用できます。また、あなたが確認する方法を少し変更する必要があります。それは少しより適切な私の意見であるとして最終的に私は使用Spyの代わりMockを使用します。あなた除く

public class UnitTester{ 

@InjectMocks 
private A aInstance; 

@Spy 
private Map mapSpy; 

@Before 
public void init(){ 
    MockitoAnnotations.initMocks(this); 
} 

@Test 
public void test(){ 
    // Act 

    ainstance.method1(); 
    ainstance.method2(); 

    InOrder inOrder = inOrder(mapSpy); 
    inOrder.verify(mapSpy).put("a", "A"));  
    inOrder.verify(mapSpy).put("b", "B"));  
} 
+0

することができます '@ MapインタフェースSpy'ではないとして。 '@ Spy'を実行する前に、mapSpyの具体的な型を宣言しなければなりません。 –

関連する問題