我有一个静态方法,它使用 PowerMock 模拟以抛出异常。 (它会删除文件。)不幸的是,在我的 @After
(每次测试后)方法中,我需要在没有模拟的情况下调用此方法。我怎样才能 umock 一个方法?
我没有看到与 Mockito.reset()
等效的东西。 [引用:mockito : how to unmock a method? ]
例子:
@RunWith(PowerMockRunner.class)
@PrepareForTest(PathUtils.class) // Important: This class has a static method we want to mock.
public class CleaningServiceImplTest2 extends TestBase {
public static final File testDirPath = new File(CleaningServiceImplTest2.class.getSimpleName());
@BeforeClass
public static void beforeAllTests() throws PathException {
recursiveDeleteDirectory(testDirPath);
}
@AfterClass
public static void afterAllTests() throws PathException {
recursiveDeleteDirectory(testDirPath);
}
private File randomParentDirPath;
private CleaningServiceImpl classUnderTest;
@Before
public void beforeEachTest() {
randomParentDirPath = new File(testDirPath, UUID.randomUUID().toString()).getAbsoluteFile();
classUnderTest = new CleaningServiceImpl(randomParentDirPath);
}
@After
public void afterEachTest() throws PathException {
recursiveDeleteDirectory(randomParentDirPath);
}
public static void recursiveDeleteDirectory(File dirPath) throws PathException {
// calls PathUtils.removeFile(...)
}
@Test
public void run_FailWhenCannotRemoveFile() throws IOException {
// We only want to mock one method. Use spy() and not mockStatic().
PowerMockito.spy(PathUtils.class);
// These two statements are tightly bound.
PowerMockito.doThrow(new PathException(PathException.PathExceptionReason.UNKNOWN, randomParentDirPath, null, "message"))
.when(PathUtils.class);
PathUtils.removeFile(Mockito.any(File.class));
classUnderTest.run();
}
}
最佳答案
这花了我一段时间才弄清楚,所以我正在回答我自己的问题。
据我所知,您需要“撤消”每个模拟。 Mockito.reset()
不适用于 Class<?>
引用。在测试方法的末尾,添加:
// Undo the mock above because we need to call PathUtils.removeFile() within @After.
PowerMockito.doCallRealMethod().when(PathUtils.class);
PathUtils.removeFile(Mockito.any(File.class));
关于java - PowerMock:如何取消模拟一个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19907515/