Мокито проверяет коллекцию струн - PullRequest
0 голосов
/ 29 октября 2018

Я хочу убедиться, что точный Collection передан в поддельный метод. Вот как я пытался это сделать:

Это простой пример моего реального кода, который воспроизводит точно такую ​​же проблему.

import com.google.common.collect.Lists;
import org.hamcrest.Matchers;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.mockito.hamcrest.MockitoHamcrest;

import java.util.Collection;

public class MockTest {

    @Test
    void mockTest() {

        final Collection<String> collection = Mockito.mock(Collection.class);

        collection.addAll(Lists.newArrayList("hello"));

        Mockito.verify(collection).addAll(MockitoHamcrest.argThat(Matchers.contains("hello")));
    }
}

но это не работает, и я получаю эту ошибку компиляции:

Error:(20, 35) java: incompatible types: inference variable T has incompatible bounds
    equality constraints: java.lang.Iterable<? extends E>
    lower bounds: java.util.Collection<? extends java.lang.String>,java.lang.Object

Есть идеи, почему это не работает или как я могу сделать это по-другому?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Для записи, вы ничего не тестируете с этим тестом, так как вы высмеиваете тестируемый объект.

Ради опыта вы столкнулись с этой ошибкой, потому что метод Collection#addAll ожидает параметр типа Collection, тогда как вы предоставляете один из типов Iterable.

Объект Iterable может быть Collection или может не быть, поэтому компилятор не может обеспечить безопасность типов этого кода.

Один из способов проверить, что ваш смоделированный метод вызывается с правильными аргументами, - это использовать ArgumentCaptor.

Collection<String> collection = Mockito.mock(Collection.class);

collection.addAll(Lists.newArrayList("hello"));

ArgumentCaptor<Collection<String>> methodParameterCaptor = ArgumentCaptor.forClass(Collection.class);
Mockito.verify(collection).addAll(methodParameterCaptor.capture()); // same as writing verify(collection, times(1)).add ...
assertThat(methodParameterCaptor.getValue()).containsOnly("hello");
0 голосов
/ 29 октября 2018

пожалуйста, попробуйте ниже код

@Test
public void mockTest() {

    final Collection<String> collection = Mockito.mock(Collection.class);

    collection.addAll(Lists.newArrayList("hello"));

    Mockito.verify(collection).addAll((Collection<? extends String>) MockitoHamcrest.argThat(Matchers.contains("hello")));
}
...