繁体   English   中英

Mockito继续调用真实方法而不是对其进行模拟

[英]Mockito keeps calling the real method and not mock it

我正在尝试创建一个测试,其中我必须在要测试的类中模拟一个方法。 但是它一直在调用真正的方法,但是我想模拟它。

我要嘲笑的方法是

extractSecretValue(字符串路径)

我知道这不是在嘲笑该方法,因为有一个“ println”,它正在打印。

我究竟做错了什么?

我正在使用JUnit 5

我要测试的课程:

    @Configuration
    public class RestTemplateConfig {

        @Value("${******}")
        private String keystore;

        @Value("${******}")
        private String identificador;

        @Value("${******}")
        private String token;

        @Bean
        public RestTemplate restTemplate() throws NoSuchAlgorithmException, KeyManagementException {
            SSLContext context = null;

            context = SSLContext.getInstance("TLSv1.2");
            context.init(null, null, null);

            List<Header> headers = new ArrayList<>();
            headers.add(new BasicHeader("Authorization", "Bearer " + extractSecretValue(token)));

            CloseableHttpClient httpClient = HttpClientBuilder.create().setSSLContext(context).setDefaultHeaders(headers)
                    .build();

            HttpComponentsClientHttpRequestFactory hcchr = new HttpComponentsClientHttpRequestFactory(httpClient);

            hcchr.setConnectionRequestTimeout(10000);

            return new RestTemplate(hcchr);

        }

        public String extractSecretValue(String path) {

            System.out.println("Test1");
            Path secretPath = Paths.get(path);
            String value = "";
            try (Stream<String> lines = Files.lines(secretPath)) {
                value = lines.collect(Collectors.joining());
            } catch (IOException ignored) {
                throw new ApplicationException(ignored);
            }
            return value.isEmpty() ? path : value;
        }

    }

测试类:

    @ExtendWith(MockitoExtension.class)
    public class RestTemplateConfigTest {

        @Test
        public void return_restTemplateConfig() {

            RestTemplateConfig restTemplateConfig = new RestTemplateConfig();

            RestTemplateConfig restTemplateMock;

            RestTemplate restTemplate;

            restTemplateMock = Mockito.spy(restTemplateConfig);

            try {
                when(restTemplateMock.extractSecretValue(anyString())).thenReturn("423424");
                restTemplate = restTemplateMock.restTemplate();
            } catch (NoSuchAlgorithmException | KeyManagementException e) {
                throw new ApplicationException(e);
            }

        }

    }

我也已经尝试过了:

doReturn("2332").when(restTemplateMock).extractSecretValue(anyString());

如果使用when(...).thenReturn(...) ,则仍将调用真实方法
(来自Mockito,与您的测试无关)
但是当您使用doReturn(...).when(...)表示法doReturn(...).when(...)不应发生这种情况。

测试中的问题是tokennull,而您的anyString()不匹配,因为它仅与非null字符串匹配。

改用any() ,它匹配任何内容 ,包括null

将其与doReturn(...).when(...) ,您的测试应会成功。

如果您不希望调用实际方法,则应使用Mockito.mock()而不是Mockito.spy()。

您应该更新测试类以使用:

restTemplateMock = Mockito.mock(RestTemplateConfig.class);

您尚未嘲笑RestTemplateConfig,已实例化了它。

您想要的是:

restTemplateMock = Mockito.spy(new RestTemplateConfig());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM