【问题标题】:How to implement doNothing() for static void method?如何为静态 void 方法实现 doNothing()?
【发布时间】:2019-09-18 22:01:59
【问题描述】:

我试图模拟一种静态 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 不是我们代码的一部分,我们已经将这个外部类导入到我们的代码库中以执行一些任务。

【问题讨论】:

  • 请添加完整的 UnitTest 和相关的堆栈跟踪。
  • 问题已按要求更新。
  • 您添加的不是完整且可运行的单元测试。你使用什么注释?
  • 用@PrepareforTest(SampleClass.class) 注释测试类然后尝试
  • 还有一件事是 methodTypeStatic1 不是 void,你不应该在非 void 方法上使用 doNothing。

标签: java spring-boot mockito powermockito springmockito


【解决方案1】:

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

您的测试可能如下所示:

@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 对象外,对您没有任何作用。

【讨论】:

    猜你喜欢
    • 2015-10-12
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多