Как создать захват аргумента для объекта Map в mockito в java? - PullRequest
1 голос
/ 29 апреля 2019

Как создать захват аргумента для Map?

У меня есть код, который следует следующей схеме:

import java.util.HashMap;
import java.util.Map;

public class CompoundClass {

   public CompoundClass (String a, String b){
       this.a = a;
       this.b = b;
   }

   public String a;
   public String b;
}

public class SubClass {
    public void doSomeThingSubClass(Map<String, CompoundClass> mapSb) {
        ...
    }
}

public class Example {

    public SubClass sb;

    public Example(SubClass sb) {
        this.sb = sb;
    }

    public void doSomeThing () {
        Map<String, CompoundClass> mapSb = new HashMap<>();
        mapSb.put("x", new CompoundClass("aa","bb"));
        sb.doSomeThingSubClass(mapSb);
    }
}

И я хочу проверить, был ли вызван метод doSomethingSubClass (mapSb), в результате чего я должен иметь возможность проверить, с каким аргументом он вызывался. Для этого у меня есть следующий юнит-тест:

@Test
void TestDoSomehing(){
    SubClass sb = mock(SubClass.class);

    Example ex = new Example(sb);

    ArgumentCaptor<Map<String, CompoundClass>> argCaptor = ArgumentCaptor.forClass(Map<String, CompoundClass>.class);

    ex.doSomeThing();

    verify(sb).doSomeThingSubClass(argCaptor.capture());

    System.out(argCaptor.getValue().get('x').a);
}

Проблема в том, что приведенная выше инициализация argCaptor выдает следующее сообщение об ошибке: «Невозможно выбрать из параметризованного типа». Таким образом, вопрос заключается в том, как правильно объявить инициализацию объекта захвата аргумента для объекта карты, такого как Map? Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 29 апреля 2019

Вы можете сделать это либо:

с @SuppressWarnings («не проверено»)

  @Test
  @SuppressWarnings("unchecked")
  void TestDoSomething(){
    SubClass sb = mock(SubClass.class);

    Example ex = new Example(sb);

    ArgumentCaptor<Map<String, CompoundClass>> argCaptor = ArgumentCaptor.forClass(Map.class);

    ex.doSomeThing();

    verify(sb).doSomeThingSubClass(argCaptor.capture());

    System.out.println(argCaptor.getValue().get("x").a);
  }

или с аннотацией junit5 и @Captor:

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
@TestInstance(Lifecycle.PER_METHOD)
public class TestDoSomething {

  @Captor
  private ArgumentCaptor<Map<String, CompoundClass>> argCaptor;

  @Test
  void TestDoSomething2(){
    SubClass sb = mock(SubClass.class);

    Example ex = new Example(sb);

    ex.doSomeThing();

    verify(sb).doSomeThingSubClass(argCaptor.capture());

    System.out.println(argCaptor.getValue().get("x").a);
  }
}
0 голосов
/ 29 апреля 2019

Вы можете использовать аннотацию Captor от Mockito для объявления параметризованного экземпляра ArgumentCaptor.

Например, следующий тест компилирует и выводит aa:

@Captor
private ArgumentCaptor<Map<String, CompoundClass>> argCaptor;

@Test
void TestDoSomehing(){
    MockitoAnnotations.initMocks(this);

    SubClass sb = mock(SubClass.class);

    Example ex = new Example(sb);

    ex.doSomeThing();

    verify(sb).doSomeThingSubClass(argCaptor.capture());

    System.out.println(argCaptor.getValue().get("x").a);
}

От Javadocs :

Одним из преимуществ использования аннотации @Captor является то, что вы можете избежать предупреждений, связанных с захватом сложных универсальных типов.

...