JMockit模仿java.net.URL会导致测试无法运行
我正在Eclipse中使用junit、jmockit和Oracle JDK 7的最新版本。当我尝试模拟java.net.URL时,我的测试不会运行 我的代码中有如下内容:JMockit模仿java.net.URL会导致测试无法运行,url,junit,mocking,jmockit,Url,Junit,Mocking,Jmockit,我正在Eclipse中使用junit、jmockit和Oracle JDK 7的最新版本。当我尝试模拟java.net.URL时,我的测试不会运行 我的代码中有如下内容: URL url = new URL("String representing the url."); 所以我想在我的测试中我可以这样模拟这个: @Mocked private URL _url; 由于这适用于几乎所有其他内容,我知道URL是最终的,但我认为这对JMockit没问题 当我在eclipse中使用上面的模拟运行测
URL url = new URL("String representing the url.");
所以我想在我的测试中我可以这样模拟这个:
@Mocked private URL _url;
由于这适用于几乎所有其他内容,我知道URL是最终的,但我认为这对JMockit没问题
当我在eclipse中使用上面的模拟运行测试类时,结果是一条灰线(与绿色或红色相反),因此我假设存在某种初始化问题。测试或代码的其余部分似乎并不重要,无论我把@mock行放在什么地方,都会发生这种情况
一个解决办法会很好,解释一下到底是什么导致了这一点会更好。非常感谢您的帮助!谢谢
举个简单的例子。这实际上是一个例外,但我认为它基本上做了与我所看到的相同的事情:
package demo;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
public class Connecting {
public boolean connectionattempt() throws IOException {
URL url = new URL("http://nowhere/");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
if (connection != null) {
return true;
}
else {
return false;
}
}
}
这个测试:
package demo;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import org.junit.Test;
import mockit.Expectations;
import mockit.Mocked;
import mockit.Tested;
public class TestConnecting {
@Mocked URL _url;
@Mocked HttpURLConnection _connection;
@Tested Connecting _sut;
@Test
public void testConnect() throws IOException {
new Expectations() { {
_url.openConnection(); result = _connection;
} };
assertEquals(true, _sut.connectionattempt());
}
}
和堆栈跟踪:
java.lang.NoClassDefFoundError: org/eclipse/jdt/internal/junit/runner/TestReferenceFailure
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestListener.testFailure(JUnit4TestListener.java:91)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestListener.testFailure(JUnit4TestListener.java:69)
at org.junit.runner.notification.RunNotifier$4.notifyListener(RunNotifier.java:139)
at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:61)
at org.junit.runner.notification.RunNotifier.fireTestFailures(RunNotifier.java:134)
at org.junit.runner.notification.RunNotifier.fireTestFailure(RunNotifier.java:128)
at org.junit.internal.runners.model.EachTestNotifier.addFailure(EachTestNotifier.java:23)
at org.junit.runners.ParentRunner.run(ParentRunner.java:315)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
我使用JMockit 1.13、JUnit 4.11和Oracle JDK 1.7.067在Eclipse开普勒SR2、IntelliJ IDEA 13.1和Netbeans 8.0.1上执行了测试
所有测试都通过了,都是绿色的!所以,我不知道在你的环境中可能有什么问题。你确定JMockit的“最新版本”(当时是1.13)就是实际使用的版本吗?我看不出模仿
URL
对象有什么好处。为什么不创建一个具体的呢?如果得到一条灰线,则一定发生了异常。你能贴出堆栈跟踪吗?事实上,你能发布一个可编译的例子来演示这个问题吗?一般来说,我们试图模拟每个不是被测试系统的对象。模拟URL对象的具体好处是在调用URL.openConnection()时返回模拟的HttpURLConnection。当我运行它时,我没有看到异常或堆栈跟踪,就像测试没有初始化一样,它没有失败。由于时间的关系,我将改变连接的设置方式,并按照您的建议使用一个具体的URL。我很好奇为什么嘲笑会导致这样的结果。我在论坛上看到一篇帖子,上面说在JMockit更改为模拟URL之前,URL在JVM中被初始化。我的错误是,我忘记了openConnection()
。您能否发布一个以您描述的方式失败的快速示例测试?假设由于某种原因我们无法修复此问题,您可以将URL
对象封装在一个类中,然后进行模拟。添加了一个快速类/测试和堆栈跟踪。我可以发誓它以前没有抛出错误。但这似乎基本上是同一个问题。如果注释掉url对象的mock/stubing,它就会通过。也许不是最好的例子。。。但我现在能想到的,绝对是1.13。我想这一定是我周围的环境。我会回来评论任何更新,如果我发现了什么,但我改变了一些东西并解决了这个问题,所以我不确定什么时候我会回到它。所以我现在就接受这个答案。谢谢