我正在尝试创建一个测试,其中我必须在要测试的类中模拟一个方法。但是它一直在调用真正的方法,但我想对其进行模拟。
我要模拟的方法是
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());
答案 0 :(得分:2)
如果您使用when(...).thenReturn(...)
,则仍将调用real方法
(来自Mockito,与您的测试无关),
但是当您改用doReturn(...).when(...)
表示法时就不会发生这种情况。
测试中的问题是token
为 null ,而您的anyString()
与之不匹配,因为它仅与非null字符串匹配。
改为使用any()
,它匹配任何内容,包括 nulls 。
用doReturn(...).when(...)
组合起来,您的测试应该会成功。
答案 1 :(得分:1)
如果您不希望调用实际方法,则应该使用Mockito.mock()而不是Mockito.spy()。
您应该更新测试类以使用:
restTemplateMock = Mockito.mock(RestTemplateConfig.class);
答案 2 :(得分:0)
您还没有嘲笑RestTemplateConfig,您已经实例化了它。
您想要的是:
restTemplateMock = Mockito.spy(new RestTemplateConfig());