Mockito-验证是否在对象的方法内调用了静态方法

时间:2020-03-25 21:01:07

标签: mockito powermock powermockito

我有这样的问题

public class ErrorLog {
     public static void increment(String exception) {
          // do something
     }
}

import ErrorLog;
public class Calculator {
     public int division(int a, int b) {
          if (b == 0) {
               ErrorLog.increment("Divide by Zero");
          } else {
               return a / b;
          }
     }
}

我想验证除法调用的次数,但是当我被零除的情况下,以某种方式验证是否调用了静态方法ErrorLog.increment(使用确切的字符串作为参数)。

借助Mockito间谍,我可以执行类似的操作来确保对除法的调用。

Calculator c = new Calculator();
Calculator calcSpy = spy(c);

c.division(6, 3);
c.division(1, 0);

verify(calcSpy, times(2)).division(anyInt(), anyInt());

我也渴望验证这样的东西

verify(ErrorLog, times(1)).increment("Divide by Zero");

我研究了PowerMockito verifyStatic构造和mockStatic,也对此进行了检查mockito verify method call inside method,但是在我的情况下,对象内部调用的方法是静态的。

3 个答案:

答案 0 :(得分:1)

您是正确的verifyStatic没有任何方法来检查正在调用的方法。

但是有一种解决方法。看看这是否适合您。

模拟静态方法的方法是使用

PowerMockito.mockStatic(ErrorLog.class)

但是您也可以使用其他变体

PowerMockito.mockStatic(ErrorLog.class, invocationOnMock -> {
        assertEquals("something", invocationOnMock.getArgumentAt(0, String.class));
        return null;
    });
ErrorLog.increment("something");

如果不模拟ErrorLog类,则无法验证

答案 1 :(得分:1)

你是对的。 如果您使用静态方法,则会遇到测试和依赖项注入的问题,这是一种情况。

您应该在Singleton中转换ErrorLog,然后可以通过间谍对其进行验证。 例如:

public class ErrorLog {         
    private static ErrorLog = new ErrorLog();

    public static ErrorLog getInstance() {
        return errorLog;
    }

    public void increment(String exception) {
    // do something
    }
}

import ErrorLog;
public class Calculator {
    public int division(int a, int b) {
        if (b == 0) {
            ErrorLog.getInstance()increment("Divide by Zero");
        } else {
            return a / b;
        }
    }
}

从这一点开始,您可以使用以下代码片段测试调用:

ErrorLog errorLog = ErrorLog.getInstance();
ErrorLog errorLogSpy = spy(errorLog);

verify(errorLogSpy , times(1)).increment(any());

答案 2 :(得分:0)

感谢您的回应,它为我指明了正确的方向。对我起作用的是(我正在使用TestNG框架)。

paths.close()