Mockito.when 给出 InvalidUseOfMatchersException: 在此处检测到错位或误用的参



以下是测试类

@RunWith(MockitoJUnitRunner.class)
public class AuditServiceClientTest {
private MockMvc mockMvc;
@Mock
private RestTemplate restTemplate;
@Mock
AuditServiceClient auditServiceClient;
@Mock
ICommonDataService iCommonDataService;
private AuditServiceResponse auditServiceResponse;
private AuditServiceLog auditServiceLog;
private HttpEntity<AuditServiceLog> request;
@Before
public void setUp() throws Exception {
MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
headers.add("X-AGS-Client-Name", "test");
headers.add("X-AGS-Group-Name", "test");
headers.add("Content-Type", "application/json");
auditServiceClient = new AuditServiceClientImpl();
iCommonDataService = new CommonDataService();
auditServiceLog = new AuditServiceLog();
request = new HttpEntity<AuditServiceLog>(auditServiceLog, headers);
auditServiceResponse = new AuditServiceResponse();
auditServiceResponse.setStatus(String.valueOf(200));
auditServiceResponse.setTimestamp("1990-01-01 00:00:01");
auditServiceResponse.setDescription("Description");
Mockito.when(restTemplate.postForObject(Mockito.anyString(), any(HttpEntity.class), ArgumentMatchers.eq(AuditServiceResponse.class)))
.thenReturn(auditServiceResponse);
String a = "test";
ArrayList<Integer> mockedList = new ArrayList<Integer>();
Mockito.when(iCommonDataService.getEnvValue(Mockito.anyInt(), Mockito.anyInt(), Mockito.anyString()))
.thenReturn(a);
}
@Test
public void postTest() {
AuditServiceResponse response = null;
try {
response = auditServiceClient.post("endpoint", auditServiceLog, true);
} catch (Exception e) {
e.printStackTrace();
}
Assert.assertTrue(Integer.parseInt(response.getStatus() )== 200);
}
}

我正在得到

无效使用匹配器异常:在此处检测到错放或误用的参数匹配器

在以下行的 setUp() 方法中:

Mockito.when(iCommonDataService.getEnvValue(Mockito.anyInt(), Mockito.anyInt(), Mockito.anyString()))
.thenReturn(a);

以下是错误:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 此处检测到放错位置或误用的参数匹配器:

-> at com.auditService.test.AuditServiceClientTest.setUp(AuditServiceClientTest.java:72)

不能在验证或存根之外使用参数匹配器。
正确使用参数匹配器的示例:

when(mock.get(anyInt())).thenReturn(null);
doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());
verify(mock).someMethod(contains("foo"))

此消息可能会出现在空指针异常之后,如果最后一个 匹配器返回一个类似于 any() 的对象,但存根方法 签名期望一个基元参数,在这种情况下,使用基元 选择。

when(mock.get(any()));//错误使用,将引发 NPE
when(mock.get(anyInt()));

此外,此错误可能会出现,因为您使用参数匹配器 不能嘲笑的方法。以下方法不能存根/已验证:final/private/equals()/hashCode()。模拟方法 不支持在非公共父类上声明。

有很多关于此错误的文章,但没有一篇对我有用。Mockito.anyInt()是否有任何问题,因为Mockito.anyString()在上一行中使用并且工作正常。任何帮助,不胜感激。

仔细查看测试代码:

iCommonDataService = new CommonDataService();
...
Mockito.when(iCommonDataService.getEnvValue(Mockito.anyInt(), Mockito.anyInt(), Mockito.anyString()))
.thenReturn(a);

您正在模拟对象的方法,而不是模拟,这就是异常的原因。

由于您已经有声明了此类的模拟@Mock注释,因此您可以简单地删除此行iCommonDataService = new CommonDataService();。另一种方法是使用Mockito.mock(CommonDataService.class)手动提供模拟。

但是,如果要模拟原始对象的方法,则应改用Mockito.spy()

我使用了@RunWith(SpringRunner.class)而不是@RunWith(MockitoJUnitRunner.class)这有助于解决此问题。

相关内容

  • 没有找到相关文章

最新更新