0
我有一個junit測試,試圖使用MockUp()和@Mock路徑get(String pathStr)假Paths.get(String pathStr)返回@Mocked路徑路徑; 在JMockit 1.23和1.22這工作得很好,但與JMockit 1.24開始,高達1.28它拋出一個mockit.internal.ClassFile $ NotFoundException,它的闖民宅也爲TestClassName $ 2
new MockUp<Paths>() {
@Mock
public Path get(String first, String... more) {
return path;
}
};
每個更新JMockit看來類刪除功能,但我真的不知道這裏的主要罪惡是什麼。
更新:我現在知道MockUp是一個紅鯡魚,問題是Expectations塊不是作爲匿名內部類創建的。我不知道爲什麼。
UPDATE: 代碼重現:
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))));
}
}
你能展示一個失敗的測試嗎?對我來說,'Paths'的模型在JMockit 1.28上工作正常。 –
@Rogério所以,我剛剛在Github上提出了一個錯誤,問題是Expectations塊沒有被類加載器找到(因此TestClassName爲$ 2)。我希望我能更有幫助,但我無法及時提供可複製的代碼。也許在我的空閒時間裏,我會盡力重現,但我已經花了太多時間在上面,我們很好地保持在1.23。我所知道的是,當您對ClassFile驗證碼進行了一些更改時,無法找到期望匿名內部類,它在1.23但不是1.24下工作。 – Novaterata
@Rogério我添加了代碼來重現 – Novaterata