【问题标题】:Powermock verify private static method call in non static methodPowermock 验证非静态方法中的私有静态方法调用
【发布时间】:2013-05-13 06:12:45
【问题描述】:

亲爱的 stackoverflow 同志们, 我在让特定的 PowerMock / Mockito 案例工作时再次遇到问题。 问题是,我需要验证私有静态方法的调用,该方法是从公共非静态方法调用的。我之前在How to suppress and verify private static method calls? 上发布的一个类似示例

这是我的代码:

class Factory {

        public String factorObject() throws Exception {
            String s = "Hello Mary Lou";
            checkString(s);
            return s;
        }

        private static void checkString(String s) throws Exception {
            throw new Exception();
        }
    }

这是我的测试类:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Factory.class)
public class Tests extends TestCase {

    public void testFactory() throws Exception {

        Factory factory = mock(Factory.class);
        suppress(method(Factory.class, "checkString", String.class));
        String s = factory.factorObject();
        verifyPrivate(factory, times(8000)).invoke("checkString", anyString());
    }
}

这里的问题是,测试成功了,但它不应该成功。这不应该是因为私有静态方法应该被准确地调用 1 次。但是无论我在 times() 中输入什么值,它总是会验证它是否为真...... halp :(

【问题讨论】:

  • 您不应该真正测试private 方法。这将您的单元测试与导致痛苦的实现紧密结合。为什么不检查class 是否在应该抛出Exception 时?
  • 基本上你是对的,但不幸的是,在我的 real 项目中,抛出异常的方式和时间隐藏在封闭代码中。这就是为什么我要进行压制行为。我只需要验证对它的调用。

标签: java mockito powermock non-static


【解决方案1】:

好的,我想我找到了答案,但很头疼。 Rudy 给了我使用间谍的最后提示,但它仍然不是微不足道的(尽管解决方案看起来“很容易”)。这是完整的解决方案:

import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.times;
import static org.powermock.api.mockito.PowerMockito.verifyPrivate;
import static org.powermock.api.mockito.PowerMockito.doNothing;
import static org.powermock.api.mockito.PowerMockito.spy;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Factory.class)
public class Tests extends TestCase {

    public void testFactory() throws Exception {

        Factory factorySpy = spy(new Factory());
        String s = factorySpy.factorObject();
        doNothing().when(factorySpy, "checkString", anyString());
        verifyPrivate(factorySpy, times(1)).invoke("checkString", anyString()); 
    }
}

【讨论】:

  • 游戏迟到了,但你也可以通过 mockStatic(Factory.class);然后 doNothing().when(Factory.class, "checkString", anyString());那你就不需要创建spy实例了
  • 嗨 Victor Grazi 我不知道如何验证私有静态方法在公共静态方法中被调用。我应该写什么而不是 verifyPrivate(factorySpy, times(1)).invoke("checkString", anyString());让它与 mockStatic 一起工作?
猜你喜欢
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 2013-03-20
  • 1970-01-01
相关资源
最近更新 更多