Powermock验证非静态方法私有静态方法调用(Powermock verify private

2019-09-02 19:11发布

亲爱的同志们计算器,我再次在得到一个特定的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次。 但无论我把什么样的价值在时间(),它总是确认其为真... HALP :(

Answer 1:

好吧,我想我找到了答案,但它是一个头痛的问题。 鲁迪给了我最后一丝使用间谍使用,但它仍然是不平凡的(虽然解决方案看起来“婴儿易”)。 下面是完整的解决方案:

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


文章来源: Powermock verify private static method call in non static method