Powermockito doNothing for method with arguments

2022-09-02 20:15:31

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

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

public static void readResources(ResourcesElement resourcesElement);

ResourcesElement也是由我编码的。在测试中,我想创建自己的资源,所以我希望上述方法不执行任何操作。我尝试使用此代码:

    PowerMockito.spy(Resource.class);
    PowerMockito.doNothing().when(Resource.class, "readResources", Matchers.any(ResourcesElement.class));

单元测试引发异常:

org.mockito.exceptions.misusing.UnfinishedStubbingException: Unfinished stubbing here 检测到: -> at org.powermock.api.mockito.internal.PowerMockitoCore.doAnswer(PowerMockitoCore.java:36)

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

PowerMockito.when(Resource.class, "readResources", Matchers.any(ResourcesElement.class)).....

做没有东西不是一个选项之后什么时候。

我设法使用该方法的2个参数版本使没有参数的方法什么都不做。例如:

PowerMockito.doNothing().when(Moduler.class, "startProcessing");

这有效(startProcessing不接受任何参数)。

但是,我怎样才能使那些需要参数的方法对Powermockito不做任何事情呢?


答案 1

您可以在下面找到一个功能齐全的示例。由于您没有发布完整的示例,我只能假设您没有使用或因为其余部分看起来很好而注释测试类。@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!");
    }
}

答案 2

为什么要经历这么多的麻烦,只是为了让你的方法什么都不做。只需调用就应该将类中的所有静态方法替换为默认存根,这基本上意味着它们不执行任何操作。PowerMockito.mockStatic(Resource.class)

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


推荐