any()
@value字段的匹配器 Strict stubbing argument mismatch
错误。
有吗 ArgumentMatcher
是否适合 @Values 字段?也许有人知道为什么“any()”不起作用?
字段( sampleVersion
),我使用@value注解从application.properties获得,它在测试值中有 null
(证明-第一行日志)。甚至日志也显示 null
应该是matcher null
.
ps我用这个解决了这个问题:
ReflectionTestUtils.setField(someClass, "serviceUrl", "value");
但我很好奇这有必要吗?为什么这么简单 any()
不起作用。
日志:
sampleVersion has value: null
Strict stubbing argument mismatch. Please check:
- this invocation of 'postForEntity' method:
restTemplate.postForEntity(
null,
<{key=null},[Content-Type:"application/json"]>,
class java.lang.String
);
-> at com.some.package.SomeClass.someMethod(SomeClass.java:126)
- has following stubbing(s) with different arguments:
1. restTemplate.postForEntity(null, null, null);
-> at com.some.package.SomeClassTest.someTest(SomeClassTest.java:59)
方法:
@Value("${sample.version}")
private String sampleVersion;
public ResponseEntity someMethod() {
System.out.println("sampleVersion has value: " + sampleVersion);
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("key", sampleVersion);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return restTemplate.postForEntity(sampleVersion, new HttpEntity<>(paramMap, headers), String.class);
}
测试:
@InjectMocks
SomeClass someClass = new SomeClass();
@Test
void someTest() {
//given
ResponseEntity response = new ResponseEntity("{ \"text\" : \"hello\"}", HttpStatus.OK);
//when
when(restTemplate.postForEntity(any(), any(), eq(String.class))).thenReturn(response);
ResponseEntity responseEntity = someClass.someMethod();
assertNotNull(responseEntity);
}
环境:
java 11
Spring Boot2.1.4
Mockito2.27.0
木星5.3.2
1条答案
按热度按时间wyyhbhjk1#
有2个
postForEntity
可能需要3个参数:ResponseEntity postForEntity(String url, Object request, Class responseType, Object... uriVariables)
<T> ResponseEntity<T> postForEntity(URI url, Object request, Class<T> responseType)
在生产代码中,您调用的是第一个。在你的测试中,你用第二个来代替。这是因为在你的电话中:
提供3个参数,提供的值与第二个重载的参数类型匹配。因此,甚至没有考虑varargs的过载(any()返回null,这对uri和string都是很好的匹配。
与其反思,不如建议:
对sampleversion使用构造函数注入
在测试中的服务上删除@injectmock
相反,在beforeach方法中构造测试中的服务。