模拟 returns void with PowerMock 的静态方法不起作用

Mocking static method that returns void with PowerMock does not work

我尝试了所有关于类似问题的答案,但我无法解决问题(比如 This

我有这个class(简体)

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(...

The method when(T) in the type Stubber is not applicable for the arguments (void)

或者如果我使用 PowerMokito.doNothing().when(...

The method when(Class) in the type PowerMockitoStubber is not applicable for the arguments (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));

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

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

这应该有效

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

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

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