![](/img/trans.png)
[英]How to throw exception using PowerMock/PowerMockito/Mockito when a call to void method is made?
[英]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
}
}
使用 mockStatic 对我来说不是一个选项,因为FileHandler
用于测试的设置和拆卸,这种笨拙的方法会导致问题。
是什么从org.powermock.api.support.membermodification.MemberModifier
中拯救了我的stub
和method
。
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.