对于带参数的方法,Powermockito doNothing

Ana*_*001 13 java unit-testing powermock

我用Java开发了一个应用程序,我正在尝试使用Powermockito创建单元测试(我应该补充一点,我是单元测试的新手).

我有一个名为Resource的类,它有一个名为readResources的静态方法:

public static void readResources(ResourcesElement resourcesElement);
Run Code Online (Sandbox Code Playgroud)

ResourcesElement也由我编码.在测试中,我想创建自己的资源,所以我希望上面的方法什么都不做.我尝试使用此代码:

    PowerMockito.spy(Resource.class);
    PowerMockito.doNothing().when(Resource.class, "readResources", Matchers.any(ResourcesElement.class));
Run Code Online (Sandbox Code Playgroud)

单元测试抛出异常:

org.mockito.exceptions.misusing.UnfinishedStubbingException:此处检测到未完成的存根: - > at org.powermock.api.mockito.internal.PowerMockitoCore.doAnswer(PowerMockitoCore.java:36)

Powermockito还建议我应该使用thenReturn或者之后使用Thhrow,但似乎方法'when'在doNothing之后调用时返回void(这是合乎逻辑的).如果我尝试:

PowerMockito.when(Resource.class, "readResources", Matchers.any(ResourcesElement.class)).....
Run Code Online (Sandbox Code Playgroud)

什么都不是后来的选择.

我设法使用方法的2个参数版本创建没有参数的方法,什么都不做.例如:

PowerMockito.doNothing().when(Moduler.class, "startProcessing");
Run Code Online (Sandbox Code Playgroud)

这工作(startProcessing不接受任何参数).

但是,我怎样才能制定出与Powermockito无关的方法呢?

Mor*_*fic 20

您可以在下面找到功能齐全的示例.由于你没有发布完整的例子,我只能假设你没有用@RunWith或者注释测试类,或者@PrepareForTest因为其余的似乎没问题.

@RunWith(PowerMockRunner.class)
@PrepareForTest({Resource.class})
public class MockingTest{

    @Test
    public void shouldMockVoidStaticMethod() throws Exception {
        PowerMockito.spy(Resource.class);
        PowerMockito.doNothing().when(Resource.class, "readResources", Mockito.any(String.class));

        //no exception heeeeere!
        Resource.readResources("whatever");

        PowerMockito.verifyStatic();
        Resource.readResources("whatever");
    }

}

class Resource {
    public static void readResources(String someArgument) {
        throw new UnsupportedOperationException("meh!");
    }
}
Run Code Online (Sandbox Code Playgroud)


Ani*_*kur 6

为什么要经历这么多的麻烦,以至于你的方法没有做任何事情。只是调用PowerMockito.mockStatic(Resource.class)应该用默认存根替换类中的所有静态方法,这基本上意味着它们什么都不做。

除非您确实想更改方法的行为以实际执行某些操作,否则调用PowerMockito.mockStatic(Resource.class)就足够了。当然,这也意味着类中的所有静态方法都需要考虑。