gpt4 book ai didi

junit - 忽略调用内部静态调用

转载 作者:行者123 更新时间:2023-12-05 00:17:03 24 4
gpt4 key购买 nike

public static ResponseBean call(Bean bean) throws Exception {
// statements...
IgnoreCall.ignoreMethodCall(bean);
// statements...

// return
}

使用上面的代码片段,是否可以测试忽略 IgnoreCall.ignoreMethod(Bean) 调用的方法?无需将整个语句置于 bool 条件下?

这是单元测试代码片段:
@RunWith(PowerMockRunner.class)
@PrepareTest
public ClassHelperTest {

@Test
public void testCall() throws Excpetion {
// stubbing...
ResponseBean responseBean = ClassHelper.call(bean);
// verify/ies
// assert/s
}

}

笔记:
  • 重构 ClassHelper.call(Bean)应该避免。即使是糟糕的 OO 设计,重构也是代价高昂的。
  • 除非另一种模式适用于替换,否则方法签名将被锁定。
  • 尝试使用 Mockito.whenPowerMockito.when在目标静态方法上, stub 在运行时调试中不起作用。
  • 最佳答案

    由于您的评论表明无法更改您的生产代码,因此您“只需”深入研究 PowerMock 的静态模拟方面;如概述 here例如。

    基本上你需要为静态模拟启用 IgnoreCall;然后你调用 ignoreMethodCall() 一个空操作。

    但是,正如您一直在问:您问题的核心问题是您想模拟一个 的事实。静态 方法是 作废 .我在下面有一个完整的例子,但在此之前有一些解释。

    关键是:你调用一个方法有两个原因:

  • 它有副作用
  • 它返回一个值,并且可能还会引起副作用

  • void 方法可以 只有被称为副作用。问题是:当您进行静态模拟时,它适用于 类(class)等级。

    意思是:您指示 PowerMock “阻止”执行某个类的任何静态方法;您只需“消除”所有这些静态方法的副作用!所以,通过告诉 PowerMock 做那些静态模拟,所有的 void 方法都已经“消失”了。

    但如前所述,您也可以调用方法来获取它们的返回值。然后是当 when() Mockito 的方法开始了。你用那个方法说:当那个返回值的方法被调用时,然后做这个或那个。

    长话短说;这是使用您要求的元素的 [mcve]:
    package ghostcat.test;

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.powermock.api.mockito.PowerMockito;
    import org.powermock.core.classloader.annotations.PrepareForTest;
    import org.powermock.modules.junit4.PowerMockRunner;

    class IgnoreCall {
    public static void ignoreMethodCall(Object o) {
    System.out.println("SHOULD NOT SHOW UP: " + o);
    }
    }

    class CuT {
    public static Object call(Object bean) {
    System.out.println("statement1");
    IgnoreCall.ignoreMethodCall(bean);
    System.out.println("statement2");
    return "whatever";
    }
    }

    @RunWith(PowerMockRunner.class)
    @PrepareForTest(IgnoreCall.class)
    public class PMTest {
    @Test
    public void test() {
    PowerMockito.mockStatic(IgnoreCall.class);
    CuT.call("yeha");
    }
    }

    就像你的例子一样......有 IgnoreCall;在我刚刚称为“调用”的静态方法中使用。

    这打印:
    statement1
    statement2

    当我进去评论时
    //      PowerMockito.mockStatic(IgnoreCall.class);

    它打印:
    statement1
    SHOULD NOT SHOW UP: yeha
    statement2

    所以,一个简单的例子应该告诉你 正好你需要做什么。

    我使用了 eclipse neon、IBM java8 JDK,并且只是将 powermock-mockito-junit-1.6.6.zip 中的所有 JAR 导入到我的测试项目中。

    关于junit - 忽略调用内部静态调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41013979/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com