jmockit MockUp<Paths> mockit.internal.ClassFile$NotFoundException
jmockit MockUp<Paths> mockit.internal.ClassFile$NotFoundException
我有一个 junit 测试试图使用 MockUp() 和 @Mock Path get(String pathStr) 伪造 Paths.get(String pathStr) returns @Mocked Path 路径;
在 JMockit 1.23 和 1.22 中,这工作正常,但从 JMockit 1.24 开始到 1.28,它抛出一个 mockit.internal.ClassFile$NotFoundException 并且它引用的 class 也是 TestClassName$2
new MockUp<Paths>() {
@Mock
public Path get(String first, String... more) {
return path;
}
};
JMockit 的每次更新似乎都删除了功能,但我真的不知道这里的主要错误是什么。
更新:我现在知道 MockUp 是一个转移注意力的问题,问题是 Expectations 块不是作为匿名内部 class 创建的。我不知道为什么。
更新:
重现代码:
package foo;
import mockit.Expectations;
import mockit.Mock;
import mockit.MockUp;
import mockit.Mocked;
import org.junit.Test;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Duration;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertThat;
public class ReproJMockitBug {
private Duration foo(File file, Path path, Duration duration) {
final boolean exists = Files.exists(path);
if (!exists && Paths.get("").equals(path)) {
System.out.print(file.getAbsolutePath());
return duration.plusMinutes(1);
}
return duration;
}
@Test
public void shouldReturnErrorForInvalidFilePath(@Mocked Duration duration, @Mocked File file, @Mocked Path path) {
String pathStr = "/some/test";
new MockUp<Paths>() {
@Mock
public Path get(String first, String... more) {
return path;
}
};
new MockUp<Files>() {
@Mock
public boolean exists(Path path, LinkOption... options) {
return false;
}
};
new Expectations() {{
onInstance(duration).plusMinutes(1);
result = Duration.ofMinutes(3);
onInstance(file).getAbsolutePath();
result = pathStr;
}};
assertThat(foo(file, path, duration), is(equalTo(Duration.ofMinutes(3))));
}
}
这是一个更简单的复制器测试:
@Test
public void issue350Reproducer(@Mocked File file) {
new MockUp<Runnable>() {};
}
因此,Expectations
的使用无关紧要。实际的错误在 File
.
的模拟中
不要在任何测试方法之外使用@Mocked File 文件,像这样用作本地模拟
@Test
public void youMethodName(@Mocked File file) {
new MockUp<Runnable>() {
{
b;
result=file;
}
};
}
我有一个 junit 测试试图使用 MockUp() 和 @Mock Path get(String pathStr) 伪造 Paths.get(String pathStr) returns @Mocked Path 路径; 在 JMockit 1.23 和 1.22 中,这工作正常,但从 JMockit 1.24 开始到 1.28,它抛出一个 mockit.internal.ClassFile$NotFoundException 并且它引用的 class 也是 TestClassName$2
new MockUp<Paths>() {
@Mock
public Path get(String first, String... more) {
return path;
}
};
JMockit 的每次更新似乎都删除了功能,但我真的不知道这里的主要错误是什么。
更新:我现在知道 MockUp 是一个转移注意力的问题,问题是 Expectations 块不是作为匿名内部 class 创建的。我不知道为什么。
更新: 重现代码:
package foo;
import mockit.Expectations;
import mockit.Mock;
import mockit.MockUp;
import mockit.Mocked;
import org.junit.Test;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Duration;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertThat;
public class ReproJMockitBug {
private Duration foo(File file, Path path, Duration duration) {
final boolean exists = Files.exists(path);
if (!exists && Paths.get("").equals(path)) {
System.out.print(file.getAbsolutePath());
return duration.plusMinutes(1);
}
return duration;
}
@Test
public void shouldReturnErrorForInvalidFilePath(@Mocked Duration duration, @Mocked File file, @Mocked Path path) {
String pathStr = "/some/test";
new MockUp<Paths>() {
@Mock
public Path get(String first, String... more) {
return path;
}
};
new MockUp<Files>() {
@Mock
public boolean exists(Path path, LinkOption... options) {
return false;
}
};
new Expectations() {{
onInstance(duration).plusMinutes(1);
result = Duration.ofMinutes(3);
onInstance(file).getAbsolutePath();
result = pathStr;
}};
assertThat(foo(file, path, duration), is(equalTo(Duration.ofMinutes(3))));
}
}
这是一个更简单的复制器测试:
@Test
public void issue350Reproducer(@Mocked File file) {
new MockUp<Runnable>() {};
}
因此,Expectations
的使用无关紧要。实际的错误在 File
.
不要在任何测试方法之外使用@Mocked File 文件,像这样用作本地模拟
@Test
public void youMethodName(@Mocked File file) {
new MockUp<Runnable>() {
{
b;
result=file;
}
};
}