Как проверить, вызывается ли метод интерфейса - PullRequest
0 голосов
/ 19 февраля 2020

Я хотел бы проверить, вызывается ли метод из интерфейса. Например, я хотел бы проверить, что «map.put (A, B)» вызывается как в приведенном ниже коде. Как бы я сделал это в Junit? Нужно ли использовать Mockito?


  public void funcName() {
    Map<String, Object> map = new HashMap<>();
    map.put("VALUE", new Object());
    ...
  }

1 Ответ

0 голосов
/ 20 февраля 2020

Если бы код был именно тем, который вы опубликовали, Mockito было бы недостаточно: вам понадобится PowerMockito.

@RunWith(PowerMockRunner.class)
@PrepareForTest({MyClass.class})
public class MyTest{
    Map<String, Object> hashMap;

    @Before
    public void setUp() throws Exception {
        hashMap = Mockito.spy(new HashMap<>());
        PowerMockito.whenNew(HashMap.class).withAnyArguments().thenReturn((HashMap) hashMap);
    }

    /**
     * Test of doSomething method, of class MyMap.
     */
    @Test
    public void testDoSomething() {
        MyClass myClass = new MyClass();
        myClass.funcName();
        Mockito.verify(hashMap).put(Mockito.anyString(), Mockito.any());
    }
}

Использование PowerMockito действительно необходимо, когда у вас возникают проблемы с тестируемостью о:

  1. Личные методы
  2. Стати c Методы
  3. Финальный или личный класс
  4. Конструкторы

Но PowerMockito никогда не является чистым решением: всегда лучше избегать его использования ; кроме того, используя инъекционные светодиоды для лучшего дизайна.

Иногда бывает даже меньше: если бы ваш код был примерно таким:


public void funcName(Map<String, Object> map){
 // something here
  map.put("", obj);
 // other stuff
}

В этом не было бы необходимости PowerMockito:

public class MyTest{
    Map<String, Object> hashMap;

    @Before
    public void setUp() throws Exception {
        hashMap = Mockito.spy(new HashMap<>());
    }

    /**
     * Test of doSomething method, of class MyMap.
     */
    @Test
    public void testDoSomething() {
        MyClass myClass = new MyClass();
        myClass.funcName(hashMap);
        Mockito.verify(hashMap).put(Mockito.anyString(), Mockito.any());
    }
}

...