簡體   English   中英

對Map對象進行Mockito,間諜和反射的單元測試

[英]Unit tests with Mockito, spy and reflection on a Map object

我的情況有點復雜,不確定如何處理。 有一個帶有私有變量映射的對象(該對象已被初始化)。 此類在地圖上具有一系列操作。

我需要編寫一個單元測試。 它將獲取私有變量,對其進行模擬(或監視),對其執行一些操作,並驗證操作順序。 什么是最好的方法?

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不會在地圖中添加任何內容。 不知道這是因為它是反射對象還是其他原因。

您可以利用注釋來代替手動使用反射。 同樣,您應該更改驗證方式。 最后,我將使用Spy代替Mock因為我認為它更合適:

public class UnitTester{

@InjectMocks
private A aInstance;

@Spy
private Map mapSpy = new HashMap();

@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"));     
}

如果您需要進一步閱讀,我已經寫了一篇關於Mockito間諜InOrder驗證的文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM