JMockit模仿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中使用上面的模拟运行测

我正在Eclipse中使用junit、jmockit和Oracle JDK 7的最新版本。当我尝试模拟java.net.URL时,我的测试不会运行

我的代码中有如下内容:

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。我想这一定是我周围的环境。我会回来评论任何更新,如果我发现了什么,但我改变了一些东西并解决了这个问题,所以我不确定什么时候我会回到它。所以我现在就接受这个答案。谢谢