【问题标题】:JMockit hang on in unit testsJMockit 挂在单元测试中
【发布时间】:2014-06-19 23:36:30
【问题描述】:

我使用JUnit 进行单元测试。我在单元测试中使用JMockit 模拟一些java.util 类:

   new MockUp<PrintWriter>() { //HERE UNIT TESTS HANG ON
        @SuppressWarnings("unused")
        @Mock(invocations = 5)
        public void print(String s) {
            System.out.print(s);
        }

        @SuppressWarnings("unused")
        @Mock(invocations = 1)
        public void flush() {}
    };

问题:我的单元测试只是停留在模型定义上。

问题:你能猜出问题所在吗?

我的依赖:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
    </dependency>
    <dependency>
        <groupId>com.googlecode.jmockit</groupId>
        <artifactId>jmockit</artifactId>
        <version>1.7</version>
    </dependency>
</dependencies>

【问题讨论】:

  • 这里与 Mac Os x 相同。它卡在MacosxVirtualMachine.read(int, byte[], int, int) line: not available [native method]
  • @perencia 所以 JMockit 不能模拟调用本机函数的方法。我说的对吗?
  • 我不确定这是个问题..
  • 您应该颠倒 junitjmockit 依赖项之间的顺序,以便 JMockit 可以正确安装其与 JUnit 的集成。不需要 -javaagent 参数,前提是您使用的是 JDK 1.6+ 和有效的“附加 API”实现(我建议使用 Oracle JDK)。

标签: java unit-testing junit jmockit


【解决方案1】:

下面的测试类使用 JMockit 1.7 对我来说很好。

@RunWith(JMockit.class)
public class PrintWriterTest
{
    @Test
    public void useMockedPrintWriter() throws Exception {
        new MockUp<PrintWriter>() {
            @Mock(invocations = 5) void print(String s) { System.out.print(s); }
            @Mock(invocations = 1) void flush() {}
        };

        writeTextFileWithFiveLines();
    }

    void writeTextFileWithFiveLines() throws Exception {
        PrintWriter pw = new PrintWriter("temp.txt");
        pw.print("line1");
        pw.print("line2");
        pw.print("line3");
        pw.print("line4");
        pw.print("line5");
        pw.flush();
    }

    @Test
    public void useNonMockedPrintWriter() throws Exception {
        writeTextFileWithFiveLines();
    }
}

注1:以上@RunWith(JMockit.class)的使用不是必须的;它的优点只是它避免了在类路径中将 jmockit.jar 放在 junit.jar 之前 -javaagent:jmockit.jar 作为 JVM 初始化参数的需要。

注意 2:上面使用的 invocations = n 约束完全是可选的。

【讨论】:

    【解决方案2】:

    请看一下这个页面:

    http://jmockit.googlecode.com/svn-history/r1123/trunk/www/installation.html

    在第 4 步。

    您可能缺少 jmockit 代理作为默认 VM 参数:

    -javaagent:<path_to>\jmockit.jar
    

    【讨论】:

    • 谢谢。我使用jdk 1.7。几个小时后我会试试你的解决方案。
    • 我的荣幸。我也使用 1.7,但没有 jmockit 代理仍然有一些麻烦。我希望它能解决你的问题。
    • 注意:该页面的当前版本位于jmockit.googlecode.com/svn/trunk/www/gettingStarted.html
    猜你喜欢
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多