問題タブ [jmockit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java での静的ブロックのモック
Java に対する私のモットーは、「Java には静的ブロックがあるからといって、それを使用する必要があるという意味ではありません」です。冗談はさておき、Java にはテストを悪夢にするトリックがたくさんあります。私が最も嫌いなのは、匿名クラスと静的ブロックの 2 つです。スタティック ブロックを利用するレガシー コードが多数ありますが、これらは単体テストの作成を推進する際の厄介なポイントの 1 つです。私たちの目標は、最小限のコード変更で、この静的初期化に依存するクラスの単体テストを記述できるようにすることです。
これまでのところ、私の同僚への提案は、静的ブロックの本体をプライベートな静的メソッドに移動し、それを呼び出すことstaticInit
です。このメソッドは、静的ブロック内から呼び出すことができます。単体テストでは、このクラスに依存する別のクラスをJMockitstaticInit
で簡単にモックして、何もしないようにすることができます。これを例で見てみましょう。
に変更されます
JUnitで次のことができるようにします。
ただし、このソリューションには独自の問題もあります。実際には静的ブロックを に対して実行したいので、同じ JVM でDependentClassTest
とを実行することはできません。ClassWithStaticInitTest
ClassWithStaticInitTest
このタスクを達成するためのあなたの方法は何ですか? または、よりクリーンに動作すると思われる JMockit 以外のより優れたソリューションはありますか?
java - マッチャーとプリミティブ型で jmockit の期待値を使用する
単体テスト (TestNG を使用) に jmockit を使用していますが、Expectations クラスを使用して、プリミティブ型 (ブール値) をパラメーターとして受け取るメソッドをマッチャーを使用してモックアウトするのに問題があります。この問題を示すサンプル コードを次に示します。
invokeReturning(...) への呼び出しを含む行は、NullPointerException をスローします。
この呼び出しをマッチャーを使用しないように変更すると、次のようになります。
それはうまく動作します。私の実際のコードでは、実際にマルチパラメーターメソッドをモックしていて、別の引数でマッチャーを使用する必要があるため、これは私にとっては良くありません。この場合、Expectations クラスでは、すべての引数がマッチャーを使用する必要があります。
これはバグであると確信しています。または、プリミティブ型でマッチャーを使用できない可能性があります (それは悲しいことです)。誰かがこの問題に遭遇し、それを回避する方法を知っていますか?
java - jmockitでInitialContextクラスをモックする方法は?
私は自分のテストでjmockitを使用しており、テストしたい1つのクラスでInitialContext
直接使用しています。だから私は次のものを持っています:
私のテストケースでは、これを呼び出して「モック」InitialContext
クラスを使用します。
InitialContext
jmockit でクラスをモックする最良の方法は何ですか。
私はすでにいくつかの方法を試しました(自分のを使用するなどMockInitialContextFactory
)が、同じエラーに遭遇し続けています:
私が Google で見る限り、JNDI を使ったモックは非常に厄介です。誰かが私にガイダンスを提供したり、解決策を教えてくれませんか? それは大歓迎です。ありがとうございました。
java - ProcessBuilder と Process を使用する Java メソッドを単体テストするにはどうすればよいですか?
ProcessBuilder で Process を起動し、その出力をバイト配列にパイプして、プロセスが終了するとそのバイト配列を返す Java メソッドがあります。
擬似コード:
このメソッドの単体テストを行う最良の方法は何でしょうか? 信じられないほど素晴らしいJMockitを使用しても、 ProcessBuilder をモックする方法が見つかりませんでした (これは最終的なものです)。NoClassDefFoundError が返されます。
何かご意見は?
回答- Olaf が推奨したように、これらの行をインターフェイスにリファクタリングすることになりました
ここで、このインターフェイスのインスタンスを、テストしたいクラス (コンストラクター内) に渡します。通常は、元の行の既定の実装を使用します。テストしたいときは、インターフェイスのモック実装を使用するだけです。私はここで過度にインターフェースしているのではないかと思いますが...
java - JMockitカバレッジを使用しようとしたときのNoClassDefFoundError
JMockitのコードカバレッジ機能を使おうとしています。JVMパラメーターの使用
テストを実行できます(jmockit.jarとcoverage.jarはクラスパスにあります)。残念ながら、ログファイルには次のように記載されています。
...カバレッジファイルは生成されません。JMockit Coverageを機能させる人はいますか?もしそうなら、このエラーの原因について何か考えはありますか?ありがとう...
回答:(Eclipse実行構成の)ユーザーエントリだけでなく、ブートストラップエントリにカバレッジを追加する必要がありました
実際の回答実際の回答は、JUnit 3でテストを実行していたということですが、カバレッジにはJUnit 4が必要です。これで問題が修正され、ブートストラップエントリを追加する必要はありませんでした。
eclipse - Eclipse でテストを実行するときにカスタム JUnit テスト ランナーを使用する方法はありますか?
Eclipse 内の標準 JUnit テスト ランナーの代わりに、JMockitのインクリメンタル テスト ランナーを使用したいと考えています。これを行う方法はありますか?
編集JMockit 開発者への電子メールに対して次の回答を受け取りました。
「-javaagent:jmockit.jar=incjunit4」などのコマンド ラインを使用して JVM を起動する必要があります。ここで、「incjunit4」は、増分 JUnit テスト用の外部ツールをロードすることを指定します。インクリメンタル テスト ツールに必要なランタイム情報を提供するため、カバレッジ ツールも使用する必要があります。実際、主にこの機能がまだ完全に開発されていないため、それに関するドキュメントはありません。
残念ながら、これはまだ私にはうまくいきません。インクリメンタル テスト ランナーを動作させた人はいますか?
java - JMockit を使用して抽象クラスの非公開静的メソッドをモックしますか?
私は次のクラスを持っています:
このメソッドをモックしたい。JMockitを使用することにしました。そこで、モック クラスを作成します。
そして私のテストコードは次のようになります:
残念ながら、このテストでは、AbstractParent は "MOCK" ではなく "OriginalOutput" を返します。理由はありますか?私は何か間違ったことをしていますか?モッククラスも抽象として宣言しようとしましたが、役に立ちませんでした。
編集メソッドを公開すると、テストが問題なく実行されることに注意してください... JMockitでは、任意のスコープのメソッドをモックできるはずなので、これは奇妙です。
回答モック メソッドのみをパブリックにする必要があります。元のメソッドはそのままにしておくことができます。
java - JMockit で、モックされたメソッドから元のメソッドを呼び出す方法はありますか?
私のモッククラスでは、メソッド foo() をモックしています。一部のテスト ケースでは、foo() のモック実装が特別な値を返すようにします。他のテスト ケースでは、foo() の実際の実装を使用したいと考えています。モッククラスでブール値を定義して、特別な値を返すか、「実際の」メソッドを使用するかをモックメソッドで決定できるようにします。問題は、モックされたメソッドから実際のメソッドを呼び出す方法がわからないことです。
「it」という名前のモックオブジェクト内に特別なメンバーを定義できることがわかりました(オブジェクトのタイプがモックされています)。これにより、モック実装から実際のクラスを参照できます。したがって、私の計画では、foo() の「実際の」実装を呼び出す必要がある場合は、モック メソッドで it.foo() を呼び出すというものでした。ただし、 it.foo() を呼び出すと、実際のバージョンではなくモックバージョンが再度呼び出されるため、これは機能しません。そのため、無限再帰が発生します。
これを機能させる方法はありますか?
編集:コード例でより明確になる可能性があります。現在のモックされたメソッドの実装は次のようになります。
編集 2: また、ほとんどのテスト ケースでは、モックの実装は必要ありません。したがって、これに対する私の最初の試みは、モック オブジェクトが必要なテスト ケース内でのみ Mockit.redefineMethods() を呼び出すことでした。しかし、これはうまくいきませんでした-セットアップ/ティアダウン内でのみこれを行うことができるようです...私がそれを試したときに、私のモック実装は決して呼び出されませんでした.
解決策に関する注意事項:
最初は、与えられた答えがうまくいくとは思いませんでしたが、もう少し試してみると、JMockit の「コア」メソッドと「注釈」駆動のメソッドを混在させていたことが問題のようです。どうやら注釈を使用するときは、Mockit.redefineMethods() ではなく、Mockit.setupMocks を使用する必要があります。これが最終的に機能したものです:
次に、モック クラスの場合:
variables - jmockitを使用してスーパークラスの保護された変数をモックする
スーパークラスで定義された保護された変数をモックできませんでした。スーパークラスで保護されたメソッドをモックできましたが、保護された変数をサブクラスにモックできませんでした。サブクラスのテストケースを書いています。それに対する解決策。返信してください。
ありがとうシャシ