繁体   English   中英

如何使用 mockito / powermockito 使实例化的依赖 class 在特定方法调用上引发异常

[英]How to use mockito / powermockito to make an instantiated dependent class throw an exception on a specific method call

这是我要测试的代码。 这很简单

  class FileHandler {
    public boolean deleteFiles(String path) {
      // mock this to throw an exception
    }
    public static FileHandler instatiateNew(String location) {
      // creates a FileHandler
    }
  }

  class B {
    public void action {
      try {
        FileHandler x = FileHandler.instantiateNew("asd");
        x.deleteFiles();
      } catch (Exception e) {
        // untested code I want to reach
      }
    }
  }

我现在想测试方法action ,看看它如何处理 x.deleteFiles() 抛出异常。 我试过doThrow,thenThrow并遇到错误(NullPointerException,可能是因为我错误地存根方法)或者方法最终没有抛出异常。

我也很困惑是否需要 Powermockito。 我现在将尝试一种方法,在其中模拟整个 FileHandler class。 因为我需要模拟 static 实例化方法,所以我需要 PowerMock。 但我更喜欢不那么笨拙的解决方案。 它存在吗?

我的部分 class 模拟现在是:

FileHandler mockHandler = Mockito.mock(FileHandler.class)
Mockito.mock(mockHandler.deleteFiles(Mockito.anyString()).thenThrow(Exception.class);
PowerMockito.mockStatic(FileHandler.class);
PowerMockito.when(FileHandler.instantiateNew(Mockito.anyString())).thenReturn(mockHandler())

这仍然会导致问题,可能是因为 FileHandler 在其他地方使用,而 mockStatic 会杀死所有其他用法。

确保正确安排所有必要的成员,以便可以进行测试。

例如

RunWith(PowerMockRunner.class)
@PrepareForTest({FileHandler.class})
public class MyTestCase {
    public void testdeleteFilesErrorHandling() throws Exception {
        //Arrange
        //instance mock
        FileHandler handler = Mockito.mock(FileHandler.class);
        Mockito.when(handler.deleteFiles(anyString())).thenThrow(new Exception("error message"));
        //mock static call
        PowerMockito.mockStatic(FileHandler.class);
        Mockito.when(FileHandler.instantiateNew(anyString())).thenReturn(handler);
        
        B subject = new B();
        
        //Act
        subject.action();
        
        //Assert
        //perform assertion
    }
}

参考: 将 PowerMock 与 Mockito 一起使用

使用 mockStatic 对我来说不是一个选项,因为FileHandler用于测试的设置和拆卸,这种笨拙的方法会导致问题。

是什么从org.powermock.api.support.membermodification.MemberModifier中拯救了我的stubmethod

FileHandler mock = Mockito.mock(FileHandler.class);
Mockito.when(mock.deleteFiles(anyString()))
    .thenThrow(Exception.class);

stub(method(FileHandler.class, "instantiateNew", String.class)).toReturn(mock);

请注意,有必要通过测试 class 装饰器准备 class FileHandler并使用 PowerMockRunner。 这是必要的,因为我们在 FileHandler 上存根 static 方法。 这是这样做的:

@PrepareForTest({FileHandler.class})
@RunWith(PowerMockRunner.class)
public class MyTest extends MyBaseTestClass {
    @Test
    public void myTest() {
        // write test code from above here.
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM