gpt4 book ai didi

java - 静态模拟不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:59:24 25 4
gpt4 key购买 nike

我有以下尝试模拟 java.nio.file.Files 的示例单元测试,但此模拟不起作用并且代码尝试删除示例路径。

@Test
public void testPostVisitDirectory() throws Exception {
Path mockedPath = Paths.get("sample path");
PowerMockito.mockStatic(Files.class);
PowerMockito.doNothing().when(Files.class,
PowerMockito.method(Files.class, "delete", Path.class));

DeleteDirVisitor visitor = new DeleteDirVisitor(false);
Assert.assertEquals("The was a problem visiting the file",
FileVisitResult.CONTINUE,
visitor.postVisitDirectory(mockedPath, null));
}

知道哪里出了问题吗?

这是visitor.postVisitDirectory方法的内容

[...]
if (e == null) {
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
[...]

谢谢,

最佳答案

我在使用 powermock 1.5.1 和 Files 类时遇到了类似的问题,并怀疑它在静态模拟一些/所有 jdk1.7 类时有问题,尽管我不知道为什么。我还检查了 javassist 版本,当时是最新的 (3.18.0-GA),

我将我的测试类剥离到文件行,但它仍然不起作用。然后我决定尝试模拟另一个静态类 StringUtils.chop("string"); (commons-lang3) 然后我的 powermock 测试成功了,我能够强制它从模拟中生成异常。

这向我证明我已经按照书上的规定完成了所有操作,并且静态模拟不适用于 Files 类,但它适用于 StringUtils。

顺便说一句,我更改了 @PrepareForTest 和 PowerMockito.mockStatic() 调用以引用正确的类。

最后我放弃了 mocking Files。提醒一下,以防其他人遇到同样的问题。

编辑。得到它的工作:因为我在另一个项目中需要它,所以我再次尝试了这个。有一个较新版本的 PowerMock out (1.5.3) 使用更新的 javassist (3.18.1-GA) 修复了我在对另一条评论的回复中提到的错误。

即使您正在测试的类不公开静态方法。对于其他静态模拟,我之前不需要这样做。我不知道为什么需要它或对 Files 有不同的作用。

例子:

public class MyTestClass {

public void justToTestMocking(Path path) throws IOException {
if (!Files.exists(path)) {
throw new IllegalArgumentException("I know there is a deleteIfExists() but I am just testing mocking");
}
Files.delete(path);
}
}

下面的测试:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Files.class, MyTestClass.class})
public class MyTestClassTest {

@Before
public void setUp() {
mockStatic(Files.class);

}

@Test
public void justToTestMocking_WillDeletePath() throws IOException {
Path path = mock(Path.class);
MyTestClass test = new MyTestClass();

when(Files.exists(path)).thenReturn(true);

test.justToTestMocking(path);

verifyStatic();
Files.delete(path);
}
}

关于java - 静态模拟不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14966748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com