当前位置: 首页 > 知识库问答 >
问题:

忽略调用内部静态调用

萧光华
2023-03-14
public static ResponseBean call(Bean bean) throws Exception {
    // statements...
    IgnoreCall.ignoreMethodCall(bean);
    // statements...

    // return
}

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

以下是单元测试代码片段:

@RunWith(PowerMockRunner.class)
@PrepareTest
public ClassHelperTest {

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

}

注意事项:

  • 重构ClassHelper。应避免调用(Bean)。即使是糟糕的OO设计,重构也是代价高昂的
  • 方法签名被锁定,除非另一个模式适用于替换
  • 尝试使用Mockito。当和PowerMockito时。在目标静态方法上执行时,存根在运行时调试上不起作用

共有1个答案

蓬野
2023-03-14

由于您的评论表明更改生产代码是不可能的,您“只是”必须深入到PowerMock的静态模拟方面;例如,如本文所述。

基本上,您需要启用IgnoreCall以进行静态模拟;然后您进行调用以忽略metodCall()一个no-op。

但正如您不断问的那样:您的问题的核心问题是,您想要模拟一个无效的静态方法。下面我有一个完整的例子,但在此之前有一些解释。

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

  1. 它有副作用

只能对副作用调用void方法。问题是:当您进行静态模拟时,这在类级别上有效。

含义:您指示PowerMock“阻止”某些类的任何静态方法执行;您只需“擦除”所有这些静态方法的副作用!因此,通过告诉PowerMock进行这些静态模拟,所有的空方法都已经“消失”。

但如前所述,您也可以调用方法来获取其返回值。然后是Mockito的when()方法启动时。您可以使用该方法来表示:当调用该值返回方法时,执行这个或那个操作。

长话短说;这里有一个[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;在其中使用了一个静态方法,我刚刚称之为“call”。

此打印:

statement1
statement2

当我进去发表评论时

//      PowerMockito.mockStatic(IgnoreCall.class);

它打印:

statement1
SHOULD NOT SHOW UP: yeha
statement2

因此,一个简单的例子应该告诉您需要做什么。

我使用eclipse neon、IBM java8 JDK,并简单地从powermock-mockito-junit-1.6.6导入了所有JAR。压缩到我的测试项目中。

 类似资料:
  • 我正在我的一个应用程序中使用新的android导航框架。应用程序的目的是充当启动器。 有时,当我尝试更改片段(使用navcontroller导航)时,它不会更改片段,而是记录下来 我知道之前有人问过这个问题,忽略navigate()调用:FragmentManager已经保存了它的状态,但没有解决方案。 我使用以下代码导航: Navigation.findNavController(视图)。id.

  • 如果需要使用内置的规则验证单个数据,可以使用静态调用的方式。 要支持静态调用的话,必须使用think\facade\Validate类。 // 日期格式验证 Validate::dateFormat('2016-03-09','Y-m-d'); // true // 验证是否有效的日期 Validate::isDate('2016-06-03'); // true // 验证是否有效邮箱地址 Va

  • 我已经创建了服务器过滤器,它计算响应大小。它通过创建响应包装器来实现这一点,该包装器将与Apache Commons包装在一起。此外,包装器创建带有包装流的PrintWriter。因此,理论上,无论使用什么方法来创建实际输出,都应该通过CountingOutputStream。 问题是,虽然整个过程对于典型的servlet请求都有效,但对于静态内容却失败了。准确地说,过滤器接收请求,创建响应包装,

  • 我正在为maven多模块项目研究缓存实现(exstremescale),我在下面添加了maven依赖项 添加了缓存注释 cache-manager.xml 缓存只适用于项目的一个maven模块,我可以看到缓存拦截器调用,对于maven模块的其余部分,它忽略了@cacheable注释(它不会进入拦截器)。 我们没有PostConstructor或自我调用 我们使用atomikos作为事务管理器和CX

  • 这个包的主要用途就是在 API 内部执行请求。它允许你在可用的 API 基础上构建你的应用。内部请求也可以返回原始数据,而不是原始响应对象,这意味着你可以获得与之相关的所有语法糖。 我们需要构建一个分发器实例来发起内部请求。 $dispatcher = app('Dingo\Api\Dispatcher'); 我们现在可以用标准的 HTTP 进行内部请求. Route::get('/', func

  • 问题内容: 尝试在Parent类中创建1个接口和2个具体类。这将使封闭类成为内部类。 现在,我真的不确定如何在静态main()方法中创建C类的对象并调用C类的call()方法。现在我遇到了问题: 问题答案: 这里的内部类不是静态的,因此您需要创建一个外部类的实例,然后调用new, 但是在这种情况下,您可以将内部类设为静态, 那就可以使用了