使用 PowerMockito 验证最终 class 上的私有静态方法被调用
Verify private static method on final class gets called using PowerMockito
我有以下class
public final class Foo {
private Foo() {}
public static void bar() {
if(baz("a", "b", new Object())) { }
}
private static boolean baz(Object... args) {
return true; // slightly abbreviated logic
}
}
这是我的测试:
@PrepareOnlyThisForTest(Foo.class)
@RunWith(PowerMockRunner.class)
public class FooTest {
@Test
public void bar() {
PowerMockito.mockStatic(Foo.class); // prepare
Foo.bar(); // execute
verifyPrivate(Foo.class, times(1)).invoke("baz", anyVararg()); // verify - fails
}
}
为此,我收到以下错误消息 - 我不明白为什么...
Wanted but not invoked com.example.Foo.baz(
null );
However, there were other interactions with this mock.
删除上面的 prepare
行似乎使验证行通过,无论您检查了多少 times
...:(
(我们的 SONAR 代码检查强制每个测试中都有某种 assertXyz()
(因此调用 verify()
)并强制执行非常高的测试覆盖率。)
知道怎么做吗?
您的代码的问题在于您 mock Foo
因此默认情况下不会调用您的方法实现,因此当您调用 Foo.call()
默认情况下它什么都不做,这意味着它永远不会真正调用 baz
这就是你得到这种行为的原因。如果您想 部分模拟 Foo
,请使用选项 Mockito.CALLS_REAL_METHODS
模拟它,以使其像您期望的那样调用真正的方法,因此代码应该是:
@PrepareOnlyThisForTest(Foo.class)
@RunWith(PowerMockRunner.class)
public class FooTest {
@Test
public void bar() throws Exception {
PowerMockito.mockStatic(Foo.class, Mockito.CALLS_REAL_METHODS); // prepare
...
}
}
我有以下class
public final class Foo {
private Foo() {}
public static void bar() {
if(baz("a", "b", new Object())) { }
}
private static boolean baz(Object... args) {
return true; // slightly abbreviated logic
}
}
这是我的测试:
@PrepareOnlyThisForTest(Foo.class)
@RunWith(PowerMockRunner.class)
public class FooTest {
@Test
public void bar() {
PowerMockito.mockStatic(Foo.class); // prepare
Foo.bar(); // execute
verifyPrivate(Foo.class, times(1)).invoke("baz", anyVararg()); // verify - fails
}
}
为此,我收到以下错误消息 - 我不明白为什么...
Wanted but not invoked com.example.Foo.baz( null );
However, there were other interactions with this mock.
删除上面的 prepare
行似乎使验证行通过,无论您检查了多少 times
...:(
(我们的 SONAR 代码检查强制每个测试中都有某种 assertXyz()
(因此调用 verify()
)并强制执行非常高的测试覆盖率。)
知道怎么做吗?
您的代码的问题在于您 mock Foo
因此默认情况下不会调用您的方法实现,因此当您调用 Foo.call()
默认情况下它什么都不做,这意味着它永远不会真正调用 baz
这就是你得到这种行为的原因。如果您想 部分模拟 Foo
,请使用选项 Mockito.CALLS_REAL_METHODS
模拟它,以使其像您期望的那样调用真正的方法,因此代码应该是:
@PrepareOnlyThisForTest(Foo.class)
@RunWith(PowerMockRunner.class)
public class FooTest {
@Test
public void bar() throws Exception {
PowerMockito.mockStatic(Foo.class, Mockito.CALLS_REAL_METHODS); // prepare
...
}
}