以下是测试类
@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)
这有助于解决此问题。