java - 如何在没有 powermock 的情况下存根私有方法
问题描述
我有一个带有私有方法的类,它调用一些外部类并执行它,我如何在不使用 powermock 的情况下防止这种情况发生?(该项目使用 Junit5,目前还不支持 powermock)。
我考虑将这些函数移到外面,但我觉得有时方法确实属于特定类,因为它们是它的一部分,我将它们移出没有意义,下面只是一个例子来说明。
我已经知道大多数人会说不要测试私有方法,而是 a. 我不完全同意,并且b。我不想在这里测试该方法,只是为了防止它执行外部调用,甚至是伪造的 api url。
public class GenericOauth2Client implements Oauth2Client {
private NetHttpTransport HTTP_TRANSPORT;
private JsonFactory JSON_FACTORY;
public GenericOauth2Client(<some_args>) {
...
HTTP_TRANSPORT = new NetHttpTransport();
JSON_FACTORY = new JacksonFactory();
}
public foo(<some_args>) {
...
fetchRefreshTokenResponse( < some_args >);
...
}
private TokenResponse fetchRefreshTokenResponse(<some_args>)
throws IOException {
return new RefreshTokenRequest(HTTP_TRANSPORT, JSON_FACTORY, new GenericUrl(tokenServerUrl),
refreshToken.tokenValue)
.setClientAuthentication(new BasicAuthentication(clientId, clientSecret))
.execute();
}
}
如何正确处理/测试?
解决方案
为它创建另一个不公开的构造函数。还“编程到接口”,以便您可以更轻松地注入行为
public class GenericOauth2Client implements Oauth2Client {
private HttpTransport transport;
private JsonFactory jsonFactory;
public GenericOauth2Client(<some_args>) {
...
transport = new NetHttpTransport();
jsonFactory = new JacksonFactory();
}
GenericOauth2Client(<some_args>, HttpTransport t) {
this(args);
transport = t;
}
或者,如果您无法控制 http 客户端,但可以更改 url,那么 WireMock 将是模拟服务器响应的另一个选项
推荐阅读
- java - 如何根据条件在rest-api调用之间放置等待时间
- html - “刷新”行数据后的数据表列宽问题
- iptables - 有什么方法可以将 url 重定向到 localhost:443?
- android - 身份验证后在数据库中找不到用户节点
- matplotlib - 如何使用 seaborn 创建可视化
- c# - 如何使用 Graph API 在 MS Teams 中发布消息
- javascript - 在里面使用上下文和钩子
- vim - 无法使用 VIM 折叠 python 注释
- python - conda 环境中的 Python 不是 conda python
- asp.net-core-mvc - 如何避免在 MVC 核心视图的条件代码中硬编码业务实体的值?