2016-06-27 1 views
1

PowerMockで最終クラスのkotlinをどうやって試してみることができますか?私はJavaの最終的なクラスをテストするためのガイドに従ったが、私はまだこのエラーがあるPowerMockを使ってKotlinクラス(最終版)を模擬する方法は?

Cannot subclass final class 

それを行う方法はありますか?

+0

ちょうど正確には:私はあなたが意味することを推測します:あなたは最終的なクラスXを模擬したいです。 Xを使っている他のクラスYをテストすることができます。あなたは、Xをテストするために、X自体をモックする必要はありません。残念ながら、私は答えはありませんが、警告:はい、PowerMockでは最終的なクラスや静的メソッドをモックできます。一方、**あらゆる種類の奇妙な問題に直面する準備ができている**。あなたが実際に "入力コード"を変更できない場合(例えば、 "最終"修飾子を取り除くなど)、PowerMockを回すだけです。 – GhostCat

+0

@Jägermeister以前はPowerMockを使用していませんでした。あなたが直面するかもしれないいくつかの奇妙な問題は何ですか? – nhaarman

+4

PowerMockはバイトコードを操作します。したがってまず第一に、クラス**ファイルをテストするのではなく、PowerMockが作成したものです。次に、PowerMockの計測器のバイトコードとして、それに依存する他のフレームワークと競合します。カバレッジツールなどがあります。最後に、私は無限の時間を過ごしました。「奇妙な」デバッグは、PowerMockのテストケースから失敗しました。 PowerMockは、壊れた安全スイッチを備えたアサルトライフルのようなものです。ほとんどの場合動作しますが、偶発的に頭に弾丸を置くと怒ったり驚いたりしません。 – GhostCat

答えて

1

クラスのインターフェイスを作成するだけです。インターフェイスを使用してクラスを単純に疑似することができます。

+0

テストの制限のためにメインコードを修正して汚染することをお勧めしますか。 PowerMockとMockito 2はこの制限に対応できます(ただし、@ JanusonのMockito 2に関するコメントを参照してください) – Metallica

+0

私の開発者の経験では、ビジネスロジックを含むクラス用のインターフェイスを作成するのは、ほとんどの場合、良い方法です。 – IRus

+0

実際には議論の余地のある話題ですが、不要なインターフェイスを作成してもカップリングは必ずしも減少するとは限りません。(コトリンが最初に削減しようとしている)定型文を作成するだけです。インタフェースのコーディングは、複数の実装を持つ場合や、アーキテクチャの観点から有用な場合や、依存性注入を助ける場合には適していますが、それ以外の場合はコードが複雑になりますので避けてください。以下のコメントをご覧ください:http://stackoverflow.com/questions/36536727/is-it-possible-to-use-mockito-with-kotlin-without-open-the-class – Metallica

3

Mockito 2.1.0以降では、最終的な授業も模擬できます。この機能はオプションですので、Mockito拡張機能を追加して有効にする必要があります。 org.mockito.plugins.MockMakerという名前のファイルを作成し、テスト用フォルダ内のリソース/ mockito-拡張ディレクトリの下に置き

  • :これを行うには 。 モックメーカー-インライン

あなたはMockito documentationでより多くの情報を見つけることができます:

  • ファイルには、1つの行が含まれています。

  • +0

    この拡張機能はRobolectricでは動作しませんランナーはMockitoのバグ(まだMockito 2.5.0がある)とRobolectricのため。 Robolectricリポジトリには問題を修正するためのオープンプルリクエストがありますが、マージされるまではPowerMockを使用する必要があります。詳細については、https://github.com/robolectric/robolectric/issues/2677およびPR:https://github.com/robolectric/robolectric/pull/2761 – Metallica

    +0

    の問題を参照してください。このソリューションは機能しますが、テストが遅くなります。 [あなたは全てを開いてアーカイブすることができます](https://engineering.21buttons。com/mocking-kotlin-classes-with-mockito-the-fast-way-631824edd5ba)パフォーマンスの低下がない同じ結果 –

    関連する問題