我想验证是否将精确的 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")));
}
}
关于它为什么不起作用或如何以其他方式进行操作的任何想法?
答案 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");