莫基托局部变量



我正在将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" 的参数的匹配器。

相关内容

  • 没有找到相关文章

最新更新