gpt4 book ai didi

java - PowerMock、mockito、验证静态方法

转载 作者:搜寻专家 更新时间:2023-10-30 21:32:33 31 4
gpt4 key购买 nike

我正在尝试让 PowerMock 与 mockito 一起工作,并且我正在关注此处的文档:http://code.google.com/p/powermock/wiki/MockitoUsage13 .

为了简化一点,假设我有一个静态方法:

StaticObj.put(String key, String val) { ... }

要测试的类做这样的事情:

public class ClassToTest {
public void doSomething(Params p) {
if (StringUtils.isNotBlank(p.getK()) StaticObj.put("k1", p.getK());
if (StringUtils.isNotBlank(p.getX()) StaticObj.put("x1", p.getX());
}
}

在我的单元测试中,我想验证当 K 和 X 不为空或 null 时是否调用了 StaticObj.put,所以我做这样的事情:

public void testNormalCase() {
// assume that mocking setup for statics already happened in some @Before function..
Params params = new Params("k", "x");
ClassToTest classToTest = new ClassToTest();
classToTest.doSomething(params);

// now I want to verify:
PowerMockito.verifyStatic(times(1));
StaticObj.put("k1", "k1");

PowerMockito.verifyStatic(times(1));
StaticObj.put("x1", "x");
}

这行得通,这正是我所期望的。不起作用的是,如果我注释掉 K 的验证,那么 X 的验证就会失败!错误消息表明 ("x1", "x") 是预期的但得到了 ("k1", "k")。为什么是这样?我没有正确编码吗?

这也让我相信,以下通过的测试类型可能完全出于错误的原因而通过:

public void testOtherCase() {
// assume that mocking setup for statics already happened in some @Before function..
Params params = new Params("k", null);
ClassToTest classToTest = new ClassToTest();
classToTest.doSomething();

// now I want to verify:

PowerMockito.verifyStatic(never());
StaticObj.put(eq("x1"), anyString());
}

例如我想知道 powermock 是否看到“k1”,决定“x1”从未被调用,然后通过。 (?)

笼统地说,我有一个调用 N 次的静态方法(其中 N 根据输入参数而变化)。我想验证它是否在正确的情况下被调用(这可以由输入参数确定)。看来 powermock 处理得不好,除非我误解了。

感谢任何想法!

最佳答案

我仔细阅读了这个问题和问题,但不确定我是否理解清楚 - 根据我的理解,当您传递 k 和 x 但仅验证 k 时,powermock 引发异常是正确的。

因为你是在mock静态方法StaticObj.put,当你传递参数k和x并验证它时

PowerMockito.verifyStatic(times(1));
StaticObj.put("k1", "k1");

PowerMockito.verifyStatic(times(1));
StaticObj.put("x1", "x");

这应该有效。并且当你验证参数 k 和 x with verification for k 时被注释掉。

// PowerMockito.verifyStatic(times(1));
// StaticObj.put("k1", "k1");

PowerMockito.verifyStatic(times(1));
StaticObj.put("x1", "x");

Powermock 显然会首先调用 put("k1"...),因此 x 的验证会引发错误。您的验证过程已排序。

关于java - PowerMock、mockito、验证静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5285734/

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