java - 如何查找静态函数被调用 Mockito 的次数

标签 java junit mockito powermock

我有一个如下所示的函数。

public String getDecodedToken() throws UnsupportedEncodingException {
    if (token == null) {
        String token = ClassContainingStatic
                .findString("static");
        this.token = new String(Base64.decodeBase64(token), "UTF-8");
    }
    return token;
}

为了测试该函数,我不想模拟 ClassContainingStatic 类,因为它会使测试变得无用。相反,我想看看调用是否发生在 ClassContainingStatic.findString("static") 上而不模拟该对象。有没有办法实现对真实对象的函数调用次数?

最佳答案

通过一些重构当然是可能的。如果您在单独的方法中提取对静态类的调用:

public String getDecodedToken() throws UnsupportedEncodingException{
  if( token == null ){
    token = createToken();
  }
  return token;
}

String createToken() throws UnsupportedEncodingException{
  String token = ClassContainingStatic.findString("static");
  return new String( Base64.decodeBase64(token), "UTF-8" );
}

现在您可以创建一个模拟或 spy ,并简单地验证该方法是否被调用。

ClassUnderTest spy = Mockito.spy( new ClassUnderTest() );
String token = spy.getDecodedToken();
Mockito.verify( spy ).createToken();

我假设“static”字符串是固定的。如果没有,请将其作为参数传递给createToken类,然后您可以相应地调整verify

我可能在 Mockito 语法中犯了一个错误,但总体思路应该很清楚。唯一的缺点是您需要创建一个包可见/ protected (如果您愿意,甚至可以公开,但通常情况并非如此)方法,以便可以进行 verify 调用。

关于java - 如何查找静态函数被调用 Mockito 的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26442567/

相关文章:

Java字节码操作 'invokevirtual' Object继承的方法不保持一致性

java - 如何从标记为@Modifying 的存储库中测试方法?

spring - 事务注解避免服务被 mock

java - 使用对称 key (AES -128) 签署和验证消息

java - 数据库准备好后创建java bean

java - 使用mockito模拟返回ByteBuffer的方法的响应

java - 使用 Mockito 和 JUnit 进行测试时的奇怪行为

java - mockito 验证与 ArgumentCaptor 的交互

java - 模拟使用外部类的方法,mockito

java - 开始新 Activity 时如何修复连续的 logcat 消息?