Mockito验证字符串的集合

时间:2018-10-29 10:44:29

标签: java junit mockito hamcrest

我想验证是否将精确的 protected $database; function __construct() { parent::__construct(); $oDB = $this->config->item('active_db'); $this->database = $this->load->database($oDB, TRUE); } function customQuery($sql){ $query = $this->database->query( $sql ); return $query->result(); } 传递给了模拟方法。 这是我尝试执行的操作:

  

这是我真实代码的一个简单示例,它再现了完全相同的问题。

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

关于它为什么不起作用或如何以其他方式进行操作的任何想法?

2 个答案:

答案 0 :(得分: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")));
}

答案 1 :(得分:1)

为了记录,您在模拟被测对象时并未对此进行任何测试。

不过,出于经验的原因,您会遇到此错误,因为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");