【问题标题】:JMockit - initialization problemJMockit - 初始化问题
【发布时间】:2010-05-25 14:46:24
【问题描述】:

当我使用以下测试时,我得到一个警告:

警告:JMockit 是按需初始化的,这可能会导致某些测试失败; 请查看文档以获得更好的初始化方法。

这是我的测试实现:

package test;

import static mockit.Mockit.*;
import junit.framework.TestCase;
import mockit.*;
import mockit.integration.junit4.*;


import org.junit.*;
import org.junit.runner.*;

import filip.ClassUnderTest;
import filip.LowerClass;

@RunWith(JMockit.class)
public class MockTest extends TestCase {

    @MockClass(realClass = LowerClass.class)
    public static class LowerClassMock {
        @Mock(invocations = 1)
        public String doWork() {
            return "Mockowanie dziala :D";
        }
    }

    @Before
    public void setUp() { setUpMocks(LowerClassMock.class); }

    @After
    public void tearDown() { tearDownMocks(); }

    @Test
    public void testJMockit() {
        ClassUnderTest classUnderTest = new ClassUnderTest();

        classUnderTest.print();
    }

}

有什么想法吗?

【问题讨论】:

    标签: java jmockit


    【解决方案1】:

    关于链接的公认答案已经过时了,因此值得直接提及各种解决方案。

    要解决此问题,请执行以下操作之一:

    1 - 指定一个 javaagent

    将此添加到您的 JUnit 执行环境(适用于您的版本):

     -javaagent:path/to/your/jmockit/jmockit-0.998.jar 
    

    2 - 在 Maven 中配置 Surefire 插件以避免它

    将以下内容添加到您的 Maven 配置中(选择您自己的版本)

    <!-- JMockit must be before JUnit in the classpath -->
    <dependency>
      <groupId>mockit</groupId>
      <artifactId>jmockit</artifactId>
    </dependency>
    <!-- Standard unit testing -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>
    

    确保您的 Surefire 插件配置如下(针对您的特定版本):

    <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-surefire-plugin</artifactId>
       <version>2.4.3</version>
       <configuration>
          <argLine>-javaagent:${settings.localRepository}/mockit/jmockit/0.998/jmockit-0.998.jar</argLine>
          <useSystemClassLoader>true</useSystemClassLoader>
        </configuration>
     </plugin>
    

    3 - 使用 JUnit @RunWith 注解

    在每个测试类上添加这个 JUnit 运行器注释

    @RunWith(JMockit.class)
    public class ExampleTest {}
    

    【讨论】:

    • 我正在使用 maven,所以我尝试使用选项 2。但是,尽管确保 jmockit 是我的 pom 中的第一个依赖项并且surefire 插件配置为使用 -javaagent argLine,我仍然收到“按需初始化”警告。我正在使用surefire 2.6 和jmockit 0.999.4。有什么想法吗?
    • 或许也可以与选项 3 结合使用?
    • @GregInYEG,你有没有让它工作?我也有同样的问题。
    • @likka 可能值得将 jmockit 的版本升级到最新版本,它解决了类似这样的许多问题
    • 谢谢。 #3 是我在 IntelliJ 下运行的原因。
    【解决方案2】:

    据我了解,此异常是 thrown,当有人尝试调用 JMockit 方法时,而 JMockit 尚未正确初始化。

    确保遵循JMockit installation instructions,尤其是第 3 点和第 4 点。如果 JMockit jar 位于类路径中的 JUnit jar 之后,则可能会导致问题。

    【讨论】:

    • 看来,使用 eclipse 内置的 juint 库 JMockit 存在一些问题。解决方法是添加外部和单独的 JUnit jar。
    • 此已接受答案中的 JMockit 安装说明链接已损坏!
    • @FatuHoku 谢谢。更新了链接。
    • 遇到了同样的问题,第 4 点适合我。 (我不得不更改我的 Maven 依赖项的顺序)
    • 我在使用 Spring Boot 时遇到了类似的问题。确保您的构建路径中没有包含 JUnit 库。我的构建路径中包含了 JUnit lib,并且我的 pom.xml 中包含了 JUnit 和 JMockit 依赖项(JMockit 在 JUnit 之前)。从构建路径中删除额外的 JUnit 库解决了我的问题。
    【解决方案3】:

    除了加里·罗的solution

    JMockit 与 Surefire 的更强大(即版本和存储库路径无关)集成将是

    <argLine>-javaagent:${org.jmockit:jmockit:jar}
    

    为了使这个解决方案起作用,maven-dependency-plugin(版本> = 2.5.1!)需要像这样配置:

    <plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.5.1</version>
    <executions>
        <execution>
            <id>getClasspathFilenames</id>
            <goals>
                <goal>properties</goal>
            </goals>
        </execution>
    </executions>
    

    【讨论】:

      【解决方案4】:

      我在类路径中设置了一个属性文件,以便于配置 Junit 5:

      必须命名为 junit-platform.properties

      junit.jupiter.extensions.autodetection.enabled = true
      junit.jupiter.testinstance.lifecycle.default = per_class
      

      确保您使用的是具有 JmockitExtension 类的较新版本的 Jmockit。注意:Jmockit 1.8 版并不比 1.41 版更新。 1.8版本应该是1.08。

      Maven 中心参考: https://mvnrepository.com/artifact/org.jmockit/jmockit

      【讨论】:

      • 赞成指出 1.41 大于 1.8。为了避免混淆,它应该真正命名为 1.08。
      【解决方案5】:

      我只是添加了:

      @RunWith(JMockit.class)

      根据已接受答案中的文档解决了问题。

      【讨论】:

      • 这不适用于 JUnitParams 或任何其他需要 RunWith 的东西
      【解决方案6】:

      它仍然无法在 IntelliJ 中为我运行。不过我可以在命令行运行它。

      【讨论】:

        【解决方案7】:

        我在 Maven 中运行测试没有任何困难,但在 eclipse 中运行测试时遇到了同样的错误。

        JMockit Eclipse 插件让我无需任何额外配置即可在 eclipse 中运行所有测试。

        https://marketplace.eclipse.org/content/jmockit-eclipse

        这个插件的特点之一是

        自动将 JMockit jar 作为 -javaagent 参数添加到 JUnit 启动。

        【讨论】:

          【解决方案8】:

          对于 VSCode JMockito 错误 -

          您必须创建一个包含java.test.config 的 settings.json 文件。

          在该文件中添加:

          "java.test.config": [
              {
                  "name": "myConfiguration",
                  "workingDirectory": "${workspaceFolder}",
          
                  "vmargs": [ 
                    "-Xmx512M", //this was here by default
                    "-javaagent:/path/to/jmockito/" 
                  ]
              ]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-12-25
            • 2011-10-13
            • 2011-10-29
            • 2020-10-17
            • 2020-09-24
            • 2012-09-04
            相关资源
            最近更新 更多