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

问题描述 投票:1回答:2

我有这样的问题

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间谍,我可以执行类似的操作来确保对divide方法的调用。

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构造和模拟状态,也对此进行了检查mockito verify method call inside method,但在我的情况下,对象内部调用的方法是静态的。

mockito powermock powermockito
2个回答
0
投票

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

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

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

PowerMockito.mockStatic(ErrorLog.class)

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

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

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


0
投票

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

您应该以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());
© www.soinside.com 2019 - 2024. All rights reserved.