web-dev-qa-db-ja.com

JMockit-初期化の問題

次のテストを使用すると、警告が表示されます。

警告: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();
    }

}

何か案は?

31
Filip

私が理解しているように、JMockitが適切に初期化されていないときにJMockitメソッドを呼び出そうとすると、この例外は throw になります。

JMockitのインストール手順 、特にポイント3と4に従ってください。JMockitjarが後に(== --- ==)後にクラスパスは、問題を引き起こす可能性があります。

17
Etienne Neveu

受け入れられた回答はリンクに関して少し古くなっているので、さまざまな解決策を直接言及する価値があります。

この問題を解決するには、次のいずれかを実行します。

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>

-JU​​nit @RunWithアノテーションを使用

このJUnitランナーアノテーションをすべてのテストクラスに追加します

@RunWith(JMockit.class)
public class ExampleTest {}
39
Gary Rowe

Gary Roweの 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>
3

IntelliJではまだ動作しません。コマンドラインでも実行できます。

1
Ronn Macc

Mavenでテストを実行するのに問題はありませんでしたが、Eclipseでテストを実行しているときに同じエラーが発生しました。

JMockit Eclipseプラグインを使用すると、追加の構成なしですべてのテストをEclipseで実行できます。

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

このプラグインの特長の1つは

JUnit起動の-javaagent引数としてJMockit jarを自動的に追加します。

0
Peter Lustig

JUnit 5を簡単に構成するために、クラスパスにプロパティファイルを設定します。

それは[〜#〜] [〜#〜]である必要がありますjunit-platform.properties

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

JmockitExtensionクラスを持つ新しいバージョンのJmockitを使用していることを確認してください。注:Jmockitバージョン1.8 ISバージョン1.41より新しいわけではありません。1.8バージョンは1.08でした。

Maven Centralリファレンス: https://mvnrepository.com/artifact/org.jmockit/jmockit

0
TheJeff

私は単に追加しました:

@RunWith(JMockit.class)

受け入れられた回答のドキュメントに従って、どちらが問題を解決しましたか。

0