【问题标题】:Issue with Powermockito verifystaticPowermockito verifystatic 的问题
【发布时间】:2017-12-11 20:29:06
【问题描述】:

我有一个遗留类,它有一个我需要测试的静态 void 方法:

public class A {

    public static void renameTo()
    {
        String ext = "." + this.fileName + ".backup";
        for (File file : getCSVFile()) {
            f.renameTo(new File(file.getAbsolutePath() + ext));
        }

    public static File[] getAllFiles()
    {
        //logic to read the CSV files from the class path
    }


}

现在我使用 PowerMockito 为它编写了一个测试用例,看起来像这样。现在的问题是,即使只调用了renameTo(),如果我调用PowerMockito.verifyStatic( Mockito.times(10)),测试仍然通过

@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)
@PowerMockIgnore("javax.management.*")
public class ATest {

    @Test
    public void testRenameTo() throws Exception {
        PowerMockito.mockStatic(A.class);
        A.renameTo();
        PowerMockito.verifyStatic( Mockito.times(1));
        //PowerMockito.verifyStatic( Mockito.times(5));//Passes even though the mehod is called only once    
        //PowerMockito.verifyStatic( Mockito.times(10);//Passes even though the mehod is called only once    
    } 
}

有人可以解释一下这个问题吗?我可能做错了什么?

【问题讨论】:

    标签: java mockito powermock powermockito


    【解决方案1】:

    根据documentation,测试后需要先调用verifyStatic,然后调用A.renameTo()告诉它要验证哪个静态方法。示例:

    // run test
    A.renameTo();
    
    // verify interaction
    PowerMockito.verifyStatic(A.class, Mockito.times(1));
    A.renameTo();
    

    【讨论】:

    • 嗨,克里斯,如果我这样做,我会得到这个异常:Wanted but not invoked com.legacy.app.test.A.renameTo(); Actually, there were zero interactions with this mock. at org.powermock.api.mockito.internal.invocation.MockitoMethodInvocationControl.performIntercept(MockitoMethodInvocationControl.java:262) at org.powermock.api.mockito.internal.invocation.MockitoMethodInvocationControl.invoke(MockitoMethodInvocationControl.java:190)
    • 异常表明 Powermock 没有记录任何对 A.renameTo() 的调用。你能发布你修改后的代码吗?
    • 我只是在拨打renameTo()PowerMockito.mockStatic(A.class); PowerMockito.verifyStatic(Mockito.times(5)); A.renameTo();之前先拨打PowerMockito.verifyStatic(Mockito.times(5))
    • 但是如果我像下面这样运行它,它确实会调用 renameTo 方法,但 verifyStatic 仍然接受 Mockito.times() 的任何值和测试用例 @SuppressWarnings("static-access") @Test public void testGetCsvFiles() throws Exception { { A spy = PowerMockito.spy(new A()); PowerMockito.verifyStatic(Mockito.times(1)); spy.renameTo((); }
    • 对不起,我意识到我的原始答案措辞不佳。编辑得更清楚+示例。
    猜你喜欢
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    相关资源
    最近更新 更多