strict stubbing参数不匹配

flseospp  于 2021-07-15  发布在  Java
关注(0)|答案(1)|浏览(764)

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

wyyhbhjk

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) 在生产代码中,您调用的是第一个。
在你的测试中,你用第二个来代替。这是因为在你的电话中:

when(restTemplate.postForEntity(any(), any(), eq(String.class))).thenReturn(response);

提供3个参数,提供的值与第二个重载的参数类型匹配。因此,甚至没有考虑varargs的过载(any()返回null,这对uri和string都是很好的匹配。
与其反思,不如建议:
对sampleversion使用构造函数注入
在测试中的服务上删除@injectmock
相反,在beforeach方法中构造测试中的服务。

相关问题