Java 非静态方法中的Powermock验证私有静态方法调用

Java 非静态方法中的Powermock验证私有静态方法调用,java,mockito,powermock,non-static,Java,Mockito,Powermock,Non Static,亲爱的同志们:, 我在让特定的PowerMock/Mockito案例工作时再次遇到问题问题是,我需要验证私有静态方法的调用,该方法是从公共非静态方法调用的。我之前发布的一个类似的例子 这是我的代码: class Factory { public String factorObject() throws Exception { String s = "Hello Mary Lou"; checkString(s);

亲爱的同志们:, 我在让特定的PowerMock/Mockito案例工作时再次遇到问题问题是,我需要验证私有静态方法的调用,该方法是从公共非静态方法调用的。我之前发布的一个类似的例子

这是我的代码:

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();
        }
    }
这是我的testclass:

@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次。但无论我在times()中输入什么值,它都会验证它是否为真。。。哈尔普:(

好的,我想我找到了答案,但这是一个令人头痛的问题。鲁迪给了我使用间谍的最后提示,但它仍然不是微不足道的(尽管解决方案看起来“非常简单”)。以下是完整的解决方案:

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()); 
    }
}

你不应该真的测试
私有
方法。这会使你的单元测试与实现紧密结合,这会导致痛苦。为什么不检查
在应该的时候抛出一个
异常
呢?基本上你是对的,但不幸的是在我的实际项目中,异常是如何以及何时发生的rown隐藏在封闭代码中。这就是为什么我要选择抑制行为。我只需要验证对它的调用。这在游戏后期已经得到了响应,但您也可以通过执行mockStatic(Factory.class);然后执行doNothing().when(Factory.class,“checkString”,anyString())来保持它的静态;那么您不需要创建spy实例Hi Victor Grazi我不知道如何验证在公共静态方法中调用私有静态方法。我应该编写什么来代替verifyPrivate(factorySpy,times(1))。invoke(“checkString”,anyString());使其与mockStatic一起工作?