模拟使用PowerMock返回void的静态方法不起作用

时间:2018-04-17 13:33:24

标签: java mockito powermockito

我尝试了所有关于类似问题的答案,但我无法使其发挥作用(如This

我有这个课程(简化)

public class ItemParametersParser
{ ...
  public static void writeToFile(Item i,  Context c, Builder b) throws HandlerException
}

我试图模仿writeToFile方法但没有成功

@RunWith(PowerMockRunner.class)
@PrepareForTest({ItemParametersParser.class})
public class MyTest {

    @Test
    public void test() throws ... {        
        mockStatic(ItemParametersParser.class);
        doNothing().when(ItemParametersParser.class);
        ItemParametersParser.writeXMLToFile(null,null,null);
        ...
    }

这个结果转到原始方法 我还尝试使用以下方法模拟特定方法:

doNothing().when(ItemParametersParser.writeXMLToFile(any(Item.class),any(Context.class),any(Builder.class)));

但是我收到了doNothing.when(...

的错误
  

Stubber类型中的(T)方法不适用于参数(void)

或如果我使用PowerMokito.doNothing()时出现此错误。(...

  

PowerMockitoStubber类型中的(Class)不适用于参数的方法(void)

使用doAnswer也无法正常工作

修改 修复导入问题后,如@pvpkiran所述,现在可以正常工作!我可以使用doAnswer验证它。

doAnswer(new Answer<Void>() {
    public Void answer(InvocationOnMock invocation) {
      Object[] args = invocation.getArguments();
      System.out.println("called with arguments: " + Arrays.toString(args));
          return null;
    }
}).when(ItemParametersParser.class, "writeToFile", any(Item.class), any(Context.class),any(Builder.class));

2 个答案:

答案 0 :(得分:2)

您的when方法应该在对象上:

ItemParametersParser itemParametersParser= mock(ItemParametersParser.class);    
doNothing().when(itemParametersParser).writeXMLToFile(any(Item.class),any(Context.class),any(Builder.class));

答案 1 :(得分:1)

这应该有效

 @Test
  public void test() throws .... {
    mockStatic(ItemParametersParser.class);
    doNothing().when(ItemParametersParser.class, "writeToFile", any(Item.class), any(Context.class),any(Builder.class));
  }

第一个参数是被测试类的类实例,第二个参数是您要模拟的方法名称,后跟方法的参数。

确保导入org.powermock.api.mockito.PowerMockito.doNothing而不是org.mockito.Mockito.doNothing