作为参数传递时如何模拟依赖项?

How to mock an dependency when passed as an argument?

我们创建了一个公共 class,其中将 RestTemplate 作为参数传递。此休息模板用于方便:

但是,由于它不是在常见的 class 中自动装配的,所以我无法创建模拟 RestTemplate 的单元测试。有解决办法吗?

设置:

Spring 引导项目 A - 启动休息集成并利用公共 class。本项目A实例化@Autowired RestTemplate rest模板,并将其作为参数传递给常用的class方法

Spring boot Common Class - 进行 rest 集成,但使用项目 A 传递的 rest 模板。这个 common class 我无法进行单元测试,因为我不能模拟 Rest 模板。

这是一个 java spring 引导项目。

附录:

**常见 CLASS

public class RestService {


     public static void invoke(RestTemplate restTemplate, RequestDetails requestDetails) {

      switch (requestDetails.getHttpMethod()) {
            case POST:
                HttpEntity<?> postEntity = new HttpEntity<>(request, httpHeaders);
                restResponse = restTemplate.postForEntity(requestDetails.getUrl(), postEntity, String.class);
                break;
            case GET:
                HttpEntity<?> getEntity = new HttpEntity<>(httpHeaders);
                restResponse = restTemplate.exchange(requestDetails.getUrl(),
                    HttpMethod.GET, getEntity, String.class);
                break;
            default:
                break;

        }

    }

}

** 调用 CLASS

public class InvokingClass {

    @Autowired
    private RestTemplate restTemplate;


     public void invoke() {

     //RequestDetails construct here ...

        RestService.invoke(restTemplate,requestDetails)
    }

}

我不确定你想要达到什么目的。如果你想测试你的 RestService 你应该可以这样做:

    @Test
    void test() {
        RestTemplate templateMock = mock(RestTemplate.class);
        RestService.invoke(templateMock, new RequestDetails());
        verify(templateMock).postForEntity(any(URI.class), any(Object.class), any(Class.class));
    }

如果这不是您要查找的内容,请提供有关您要测试的内容的更多详细信息。谢谢