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设计,重构也是代价高昂的由于您的评论表明更改生产代码是不可能的,您“只是”必须深入到PowerMock的静态模拟方面;例如,如本文所述。
基本上,您需要启用IgnoreCall以进行静态模拟;然后您进行调用以忽略metodCall()一个no-op。
但正如您不断问的那样:您的问题的核心问题是,您想要模拟一个无效的静态方法。下面我有一个完整的例子,但在此之前有一些解释。
关键是:调用方法有两个原因:
只能对副作用调用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
问题内容: 尝试在Parent类中创建1个接口和2个具体类。这将使封闭类成为内部类。 现在,我真的不确定如何在静态main()方法中创建C类的对象并调用C类的call()方法。现在我遇到了问题: 问题答案: 这里的内部类不是静态的,因此您需要创建一个外部类的实例,然后调用new, 但是在这种情况下,您可以将内部类设为静态, 那就可以使用了
我最近对 PHP 5.4 进行了更新,但收到有关静态和非静态代码的错误。 这是错误: 这是第371行: 我希望有人能帮忙。