java - 如何为静态 void 方法实现 doNothing() ?

标签 java spring-boot mockito powermockito springmockito

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

最佳答案

如果你想模拟一个非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 注释,因此除了创建 XYZ 对象之外,使用 @InjectMocks 对您没有任何作用。

关于java - 如何为静态 void 方法实现 doNothing() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58001276/

相关文章:

java - 模拟 getClass()

java - 无法使用 Mockito 抛出异常

java - Apache HttpComponents EntityUtils 内存泄漏?

java - 使用 javassist 检测方法

java - 如何使用扩展父映射器的子映射器方法

hibernate - 由 : javax. validation.ConstraintViolationException 引起:类验证失败

java - intellij 构建包含 gradle 依赖项的 jar 工件

java - 删除 WebView 中的横幅?

spring - 无法从gradle命令行传递spring配置文件

spring-boot - Kotlin Mock Spring boot 测试无法编译