首页 > 解决方案 > 如何在没有 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();
  }
}

如何正确处理/测试?

标签: javaunit-testingjunitmockingjunit5

解决方案


为它创建另一个不公开的构造函数。还“编程到接口”,以便您可以更轻松地注入行为

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 将是模拟服务器响应的另一个选项


推荐阅读