对于带参数的方法,Powermockito doNothing

时间:2014-04-10 07:10:59

标签: java unit-testing powermock

我用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:   这里检测到未完成的存根:    - >在org.powermock.api.mockito.internal.PowerMockitoCore.doAnswer(PowerMockitoCore.java:36)

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

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

在什么时候没有选择。

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

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

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

但是,我怎样才能制作出能够将参数与Powermockito无关的方法?

4 个答案:

答案 0 :(得分:19)

您可以在下面找到功能齐全的示例。由于您没有发布完整的示例,我只能假设您没有使用@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!");
    }
}

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

如果doNothing()无效,您可以使用PowerMockito.doAnswer()进行一些破解。这使您可以模拟应该执行某些操作的void方法,例如设置值等。如果doNothing()不起作用,使用空白doAnswer()应该可以正常工作。

示例:

PowerMockito.doAnswer(new org.mockito.stubbing.Answer<Object>() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        return null; //does nothing
    }
}).when(mockObject).methodYouWantToDoNothing(args);

答案 3 :(得分:0)

也许我不能解决你的问题,但我认为有必要说明必须做什么 这个方法,所以如果你没有指定thenReturn或thenThrow或者什么powerMockito在读取你的真实代码时不知道该怎么做,例如:

真实代码:

            IPager pag;
        IPagerData<List<IDeute>> dpag;
        pag = new PagerImpl();
        pag.setFiles(nombrefilesPaginador);
        pag.setInici(1);
        dpag = gptService.obtenirDeutes(idSubjecte, idEns, tipusDeute, periode, pag);

通过mockito测试实际代码:

        IPager pag = new PagerImpl();
        pag.setInici(1);
        pag.setFiles(0);
        when(serveiGpt.obtenirDeutes(eq(331225L),
         eq(IConstantsIdentificadors.ID_ENS_BASE), 
         Matchers.any(ETipusDeute.class),
         Matchers.any(EPeriodeDeute.class), 
         eq(pag)))
        .thenThrow(new NullPointerException(" Null!"));

如果没有指定退货,我的测试将失败。 我希望它有所帮助。