5

私が今持っているもの

テスト対象のクラスが依存し、そのシングルトンがSystem.getenv(String)そのコンストラクターで使用しているサードパーティのシングルトン インスタンスがあります。この呼び出しをモックすることは可能ですか?

私はこれを試しました

JMockIt の例

    new Expectations()
    {

        System mockedSystem;
        {
            System.getenv( "FISSK_CONFIG_HOME" ); returns( "." );
        }
    };

しかし、それは私に与えEXCEPTION_ACCESS_VIOLATION、JVMをクラッシュさせます。

単体テスト用にシステム環境変数を設定する別の方法はありますか?

4

5 に答える 5

3

PowerMockは、システム クラスをモックできるように継ぎ目があります。

もう 1 つのオプション (サード パーティ API のユニット テストを行っていない場合) は、Facade用 に、簡単にモック可能なインターフェイスを備えたサード パーティ API を作成し、テスト クラスで本物ではなくこれを使用することです。

ああ、JMockIt はこれもサポートしています: package playtest;

import static org.junit.Assert.*;

import mockit.*;
import mockit.integration.junit4.JMockit;

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

@RunWith(JMockit.class)
public class JMockItTest {

 @Test
 public void mockSystemGetEnv() {
  Mockit.setUpMocks(MockSystem.class); 

  assertEquals("Bye", System.getenv("Hello"));

 }

 @MockClass(realClass = System.class)
 public static class MockSystem {
  @Mock
  public static String getenv(String str) {
   return "Bye";
  }
 }

}
于 2009-10-27T10:49:46.660 に答える
2

環境を変更することはできませんが、環境へのアクセスを変更することはできます。呼び出しをSystem.getenv()メソッドまたはヘルパー クラスでラップし、それをモックするだけです。

[編集] 問題は、サードパーティ ライブラリのコードを変更する方法です。ここでの解決策は、Java 逆コンパイラを使用してクラスを修正することです。必要に応じて、機能リクエストを送信することもできます。その新しいクラスをテスト スイートに追加します。これにより、IDE がテスト用のクラスを見つけるようになります。

テスト コードは本番環境には移行されないため、テストを実行でき、本番コードは元のライブラリを使用します。

于 2009-10-27T10:22:53.023 に答える
1

しばらく前にSystem.exit をテストしたいと思い、カスタム SecurityManagerを使用して解決策を見つけました。呼び出しが行われていること、および呼び出しの引数を確認できますが、このメソッドを使用すると、呼び出しの戻り値をモックすることはできません。

于 2009-10-27T10:46:50.760 に答える
0

@Rogérioの回答の更新。

私の場合、JMockit 1.25 では、MockUp API を使用してそれを行う必要がありました。

@Test
public void mockSystemGetenvMethod(){
    new MockUp<System>()
    {
        @Mock
        public String getenv(final String string) {
            return "";
        }
    };

    assertEquals(".", System.getenv("envVar"));
}
于 2016-08-12T10:45:50.213 に答える