首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mockito -验证是否调用了对象方法中的静态方法

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

Stack Overflow用户
提问于 2020-03-26 05:01:07
回答 3查看 185关注 0票数 1

我有一个这样的问题

代码语言:javascript
复制
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 spy,我可以这样做,以确保对divide方法的调用。

代码语言:javascript
复制
Calculator c = new Calculator();
Calculator calcSpy = spy(c);

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

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

我也热衷于验证这样的事情

代码语言:javascript
复制
verify(ErrorLog, times(1)).increment("Divide by Zero");

我研究了PowerMockito的verifyStatic结构和mockStatic,检查了这个也是mockito verify method call inside method,但在我的例子中,在对象内部调用的方法是静态的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-03-26 06:13:47

你说得对,verifyStatic没有任何方法来检查被调用的方法。

但是有一种变通方法。看看这对你是否有效。

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

代码语言:javascript
复制
PowerMockito.mockStatic(ErrorLog.class)

但您也可以使用另一种变体

代码语言:javascript
复制
PowerMockito.mockStatic(ErrorLog.class, invocationOnMock -> {
        assertEquals("something", invocationOnMock.getArgumentAt(0, String.class));
        return null;
    });
ErrorLog.increment("something");

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

票数 1
EN

Stack Overflow用户

发布于 2020-03-26 06:51:46

你是正确的。如果你使用静态方法,你会在测试和依赖注入方面遇到问题,这就是一个例子。

你应该在一个单例中转换ErrorLog,然后你可以用spy来验证它。例如:

代码语言:javascript
复制
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;
        }
    }
}

从现在开始,您可以使用以下代码片段来测试调用:

代码语言:javascript
复制
ErrorLog errorLog = ErrorLog.getInstance();
ErrorLog errorLogSpy = spy(errorLog);

verify(errorLogSpy , times(1)).increment(any());
票数 1
EN

Stack Overflow用户

发布于 2020-03-26 07:23:54

感谢你的回复,它指引我走上了正确的方向。对我产生影响的事情是这样的(我使用TestNG框架)。

代码语言:javascript
复制
package com.apple.sample.powermock;

import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;

@PrepareForTest({ErrorLog.class})
public class TestStaticMethods extends PowerMockTestCase {
    @Test
    public void testSpy() throws Exception {

        PowerMockito.mockStatic(ErrorLog.class, invocation -> {
            assertEquals("Division by Zero", invocation.getArgument(0, String.class));
                return null;
                });

        new Math().division(10, 0);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60857325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档