当前位置: 首页 > 知识库问答 >
问题:

如何在没有powermock的情况下存根私有方法

韩彬
2023-03-14

我有一个带有私有方法的类,该方法调用一些外部类并执行它,如果不使用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();
  }
}

如何正确处理/测试?

共有2个答案

孔飞翔
2023-03-14

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

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

裴卓君
2023-03-14

我的方法通常是使方法受到保护,并为测试创建一个小助手类,该类派生自被测试的类,并使用存根实现重写受保护的方法。

 类似资料:
  • 我不想再使用powermock了。因为junit5开始模拟静态类。因此,我试图摆脱powermock方法。 当我使用PowerMock时,我可以很容易地发现一个具有私有构造函数的类,然后我调用静态方法。 这是我代码的一部分(当我使用PowerMock时) 在我做了MessageValidationUtils.class的间谍对象后,我正在测试这个: 经过一些研究,我找不到任何与监视一个具有私有构造

  • 我有一个问题要解决,我应该在哪里从使用Java8 streams的员工列表中找到性别为男性的第n个员工,如果没有找到,则返回可选的空。 下面是接受Employee对象列表和整数n的方法,其中n表示必须返回的第n个男性雇员(如果存在的话)。

  • 我在项目中定义了一个模型类。和往常一样,它有一些私有变量和公共的获取者和设置者 假设在其他类中我使用这个模型,就像 然后person的私有变量保存值“my name”,我使用类的public getter访问变量,如 所以据我所知的人。getMark()返回私有变量名的引用,因此如果我修改局部变量“localMark”,它将影响Person类的私有变量,因此它会破坏变量的私有属性 前任: 我猜大多

  • 我很好奇Jackson如何创建对象,包括没有设置器的私有属性/字段,并且只使用对象空构造函数。 我之所以问这个问题,是因为当我反序列化某些属性时,我想根据这些值自动设置其他属性。例如,我不想序列化图像,只想序列化它的路径。路径反序列化后,字段Image可以加载实际图像。构造反序列化对象后,尚未分配字段。从逻辑上讲,getter没有被调用。那么是什么巫毒魔法在触摸我的物品的私人部分呢? 但是,当杰克

  • 我有一个私钥(ecdsa,secp256r1)。 如何在没有充气城堡的情况下从Java中制作公钥?

  • 问题内容: 我正在尝试设置spring xml配置,而不必创建进一步的。但是,即使我将数据库属性包括在 spring.xml: 我在这里想念什么? 问题答案: 在entityManagerFactory bean定义中指定“ packagesToScan”和“ persistenceUnitName”属性。 请注意,这适用于Spring版本> 3.1