【问题标题】:Mockito verify Collection of StringMockito 验证字符串集合
【发布时间】:2018-10-29 10:44:28
【问题描述】:

我想验证一个确切的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

知道为什么它不起作用或我该如何做不同的事情吗?

【问题讨论】:

    标签: java junit mockito hamcrest


    【解决方案1】:

    你能试试下面的代码吗

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

    【讨论】:

    • 谢谢,它有效!正如@loïc-le-doyen 所提到的,问题是addAll 想要一个CollectionMockitoHamcrest.argThat(Matchers.contains("hello")) 返回一个Iterable
    【解决方案2】:

    作为记录,您没有使用此测试测试任何内容,因为您模拟了被测对象。

    但为了体验,您会遇到此错误,因为 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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多