2015-07-14 4 views
2

У меня есть класс, какMockito Мок, когда поле изменяет

class A{ 

Map<String, String> obj; 
B b; 

public void method1(str1, str2, str3){ 
    obj = (new map dependent on str1 and str2) 
    String str = b.method2(obj, str3) 
    return str; 
} 

Как я могу издеваться b.method2. Я имею в виду, что я хочу протестировать метод1 и проверить правильность строки. Для этого я хочу сделать when(b.method2()).thenReturn("myStr").

+0

Как 'b' инициализируется? И что еще более важно - чего именно вы пытаетесь достичь? – Mureinik

+0

b подключен. И я хочу проверить метод1. Поэтому мне нужно высмеять метод2, но как я могу ссылаться на объект, когда –

+0

Вы не можете. Используйте 'any (Map.class)' при выполнении stubbing или используя 'ArgumentCaptor'. –

ответ

1

Вот полный, рабочий пример:

public class B { 
    public String method2(Map<String, String> obj, String str3) { 
     // this is irrelevant for our test of A 
     return null; 
    } 
} 

public class A { 

    private Map<String, String> obj; 
    private B b; 

    public A(B b) { 
     this.b = b; 
    } 

    /** 
    * Replaces the internal obj map to a new Map containing str1 as key and str2 as value, 
    * and calls b.method2() with that map and str3. 
    * @return the value returned by b.method2() 
    */ 
    public String method1(String str1, String str2, String str3) { 
     obj = new HashMap<>(); 
     obj.put(str1, str2); 
     String str = b.method2(obj, str3); 
     return str; 
    } 

    public Map<String, String> getObj() { 
     return obj; 
    } 
} 

public class ATest { 
    @Test 
    public void method1ShouldCallMethod2WithCreatedMap() { 
     B mockB = mock(B.class); 

     Map<String, String> expectedMap = new HashMap<>(); 
     expectedMap.put("hello", "world"); 

     when(mockB.method2(expectedMap, "!")).thenReturn("ok"); 
     A a = new A(mockB); 
     String result = a.method1("hello", "world", "!"); 
     assertEquals("ok", result); 
     assertEquals(expectedMap, a.getObj()); 
    } 

    // Same test, other technique 
    @Test 
    public void method1ShouldCallMethod2WithCreatedMap2() { 
     B mockB = mock(B.class); 


     when(mockB.method2(Mockito.<Map<String, String>>any(), anyString())).thenReturn("ok"); 
     A a = new A(mockB); 
     String result = a.method1("hello", "world", "!"); 
     assertEquals("ok", result); 

     Map<String, String> expectedMap = new HashMap<>(); 
     expectedMap.put("hello", "world"); 

     assertEquals(expectedMap, a.getObj()); 
     verify(mockB).method2(expectedMap, "!"); 
    } 
} 
+0

Как это будет работать? Поскольку мы создаем новую карту «expectedMap», но объект, возвращенный внутри mehtod1, не будет равен этой ожидаемой карте, так как будет издеваться над работой? –

+0

Спасибо, это работает, но я не уверен, почему. То, что мне трудно понять, - это если мы создаем новую карту и используем ее когда, то почему метод получает издевательство, потому что во время выполнения эта ожидаемая карта не будет равна созданной карте в методе? –

+0

Да, это будет так. две карты равны, если они содержат равные пары ключ/значение. –

Смежные вопросы