首页 > 解决方案 > 如何为静态 void 方法实现 doNothing()?

问题描述

我试图模拟一种静态 void 方法,我尝试了 PowerMock 但总是得到 NullPointer 异常。

我们正在尝试模拟以下调用 -

public Class XYZ{
  public void method1(){
     ....
     SampleClass.methodTypeStatic1().methodTypeStatic2("xyz", "mno", classVeriable);
}

主要课程是 -

public class SampleClass implements SampleClassParent{

private static SampleClass var1;

public static SampleClass methodTypeStatic1(){
    if (var1 == null) {
        //Do something on var1
    }
    return var1;
}

public void methodTypeStatic2(String localVar1, String localVar2, DifferentStaticClass localVar3) {
    //Do something
}}

我试图在我的测试课中以这种方式模拟通话 -

@RunWith(PowerMockRunner.class)
@PrepareForTest({SampleClass.class})
public class XYZTest{

   @InjectMocks
   XYZ xyzTestService;

   @Test
   public void testMethod1(){
     ...
     PowerMockito.mockStatic(SampleClass.class);
     PowerMockito.doNothing().when(SampleClass.methodTypeStatic1());
     xyzTestService.method1();
}

还要提到的是,SampleClass.class 不是我们代码的一部分,我们已将此外部类导入我​​们的代码库以执行某些任务。

标签: javaspring-bootmockitopowermockitospringmockito

解决方案


如果要模拟非 void 方法,则需要在模拟上定义此方法的行为。您可以doNothing免费获得(因为这是模拟所做的),但是您需要定义该方法应该返回的内容。

您的测试可能如下所示:

@Test
public void testMethod1() {

    SampleClass sample = new SampleClass();

    PowerMockito.mockStatic(SampleClass.class);
    PowerMockito.when(SampleClass.methodTypeStatic1()).thenReturn(sample);

    XYZ xyzTestService = new XYZ();
    xyzTestService.method1();
}

您没有提及任何@Mock注释,因此@InjectMocks除了创建XYZ对象之外, using 对您没有任何作用。


推荐阅读