我正在将mockito与spring(java 1.8)一起使用,并且我正在尝试在我的Answer对象中使用局部变量:
public IProductDTO productForMock = null;
@Bean
@Primary
public ICouchbaseDTOProvider mockCreateProductDelegate() {
CouchbaseDTOProvider mockService = mock(CouchbaseDTOProvider.class);
Mockito.when(mockService.get(anyString(), ProductDTO.class)).thenReturn((IBaseCouchbaseDTO) productForMock);
Mockito.when(mockService.getEnvironment()).thenReturn(null);
Mockito.when(mockService.insert((IBaseCouchbaseDTO) anyObject())).thenAnswer(
new Answer<IProductDTO>() {
@Override
public IProductDTO answer(InvocationOnMock invocation) throws Throwable {
productForMock = invocation.getArgumentAt(0, IProductDTO.class);
return null;
}
}
);
return mockService;
}
但是我收到此错误:
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));
该错误与您的Answer
无关。它是从这一行生成的:
Mockito.when(mockService.get(anyString(), ProductDTO.class))
.thenReturn((IBaseCouchbaseDTO) productForMock);
并且,正如错误所解释的那样,"如果匹配器与原始值组合,则可能会发生此异常"。要解决此问题,您需要使用 Matcher
而不是 ProductDTO.class
值。 eq
应该符合要求:
Mockito.when(mockService.get(anyString(), eq(ProductDTO.class)))
// Here --------------------------^
.thenReturn((IBaseCouchbaseDTO) productForMock);
错误This exception may occur if matchers are combined with raw values:
意味着:
您可以有一个包含原始值的期望:
Mockito.when(mockMixer.mix("red","white")).thenReturn("pink");
。或者,您可以有一个包含匹配器的期望:
Mockito.when(mockMixer.mix(startsWith("re"), endsWith("ite")).thenReturn("pink"));
。但您不能同时使用两者:
// Compiles, but will cause runtime exception
Mockito.when(mockMixer.mix(startsWith("re"), "white").thenReturn("pink"));
解决方法是将原始值替换为 eq("white")
- 现在您正在传递一个查找等于 "white"
的参数的匹配器。