Powermockvalidation非静态方法中的私有静态方法调用

亲爱的stackoverflow同志,我再次遇到一个问题,让特定的PowerMock / Mockito案例起作用。 问题是,我需要validation私有静态方法的调用,该方法是从公共非静态方法调用的 。 我之前发布的一个类似的示例如何抑制和validation私有静态方法调用?

这是我的代码:

class Factory { public String factorObject() throws Exception { String s = "Hello Mary Lou"; checkString(s); return s; } private static void checkString(String s) throws Exception { throw new Exception(); } } 

这是我的测试类:

 @RunWith(PowerMockRunner.class) @PrepareForTest(Factory.class) public class Tests extends TestCase { public void testFactory() throws Exception { Factory factory = mock(Factory.class); suppress(method(Factory.class, "checkString", String.class)); String s = factory.factorObject(); verifyPrivate(factory, times(8000)).invoke("checkString", anyString()); } } 

这里的问题是,测试成功,但不应该。 它不应该是因为私有静态方法应该被正确调用1次。 但无论我在时间()中放置什么价值,它总是validation它是真的…… halp 🙁

好吧,我想我找到了答案,但这很头疼。 Rudy在使用间谍时给了我最后的暗示,但它仍然不是微不足道的(尽管解决方案看起来很“容易”)。 这是完整的解决方案:

 import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.times; import static org.powermock.api.mockito.PowerMockito.verifyPrivate; import static org.powermock.api.mockito.PowerMockito.doNothing; import static org.powermock.api.mockito.PowerMockito.spy; @RunWith(PowerMockRunner.class) @PrepareForTest(Factory.class) public class Tests extends TestCase { public void testFactory() throws Exception { Factory factorySpy = spy(new Factory()); String s = factorySpy.factorObject(); doNothing().when(factorySpy, "checkString", anyString()); verifyPrivate(factorySpy, times(1)).invoke("checkString", anyString()); } }