2017-01-20 8 views
0

私は現在、いくつかのデータをレガシーアプリケーションから抽出するために、いくつかのかなり混乱したクラスを準備し、いくつかの依存関係をモックに置き換えるためにpowermockを使用しています。Powermock without JUnit

したがって、私は基本的にありませんJUnitテストを、持っている:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(LegacyDependency.class) 
public class ThisIsNotReallyATest { 
    @Test 
    public void extractData() { 
     ... prepare and wire mocks 

     // new ClassUnderTest() will essentally call LegacyDependency.getInstance() 
     Object result = new ClassUnderTest().doSomething(); 
     // save result for later reference 
    } 
} 

は、このように:これはテストではありません。これは、ひどくモデル化されたさまざまな依存関係を回避するためにPowermockの機能を使用するユーティリティクラスです。一切ユニットテストに接続されていないユーティリティを作成するためのテストフレームワークを使用したとして

は私が本当の悪い感じになり、質問です:

私は、ESP(powermockを使用することができ、静的/最後のためのPrepareForTest機能。/etc。)をスタンドアロンのソフトウェアにインストールしますか?もしそうなら:どのように?

+0

あなたのために設計されていないもののフレームワークを誤用しています。レガシーアプリケーションのソースコードを制御できる場合は、これを行う代わりにリファクタリングする必要があります。実稼働環境でのバイトコード検証の失敗に備えていますか? (はい、これはpowermockがあなたに持ってくるものです) – rkosegi

+0

これは、今後のリファクタリングのテストベースラインを準備するためのツールです。これは、その混乱の一部を掃除している間の一時的な使用のためです。 – mtj

+1

あなたは単にPowermockのランタイムバイトコードの置換/生成を利用しているようです。どうしてJavassistやByteBuddyなどを直接使ってみませんか? –

答えて

1

IMHO、質問はX/Y problemですが、

はのはClassUnderTestのコンストラクタがあるとしましょう:あなたのようないくつかのリファクタリングを行うことができ

ClassUnderTest() { 
    this.legacyDep = LegacyDependency.getInstance(); 
    // ... 
} 

そして、あなたは、いくつかのLegacyDependency行動をしないこと、 その:

+0

いいえ、「XからYにどうやって来るのですか」という質問のこの部分はありません。私が最初に言及しなかったのは、約1ミリオンのコードでビジネスクリティカルな現実世界のアプリケーションを指しているということです。私はそれをリファクタリングするのが大好きですが、これを行うには約1年間、完全なスクラムチームが必要です。今は、メソッドからデータを抽出したいだけです。通常は、アプリケーションの残りの部分を起動して実行する必要がありません。 – mtj

+0

Powermockを使用していくつかの動作を抑制することができれば、私は言ったようにリファクタリングすることができます。だから、あなたの質問を編集し、もっと具体的なコードを投稿してください。 –

+0

異なる角度から問題に取り組んでいただきありがとうございます。はい、リファクタリングが可能です。もし私が約200の変更されたコンストラクタ呼び出しを含む変更をしたいならば。私はそうではありません。これは、後のリファクタリングを準備するための基本情報を得ることです。従って、観察の対象*は現時点で変更してはならない*。私はこの質問を削除する前に、このコメントをしばらく置いておきます。 – mtj

0

私は@ rkosegiのコメントに同意します。あなたは目的のためにPowerMockを誤用しています。それは意図されていない。

しかし、私はPowerMockのクールなリフレクション機能を利用する必要があることを理解しています。残念ながら、あなたが必要としないテストフレームワーク機能と非常に密接に結びついています。 PowerMockランナーは、異なるクラスローダーでテスト環境を初期化し、いくつかのクラスをこの環境に置く前に調整するので、テストクラス、注釈などを必要とせずに、PowerMockの仕事をまったく同じように模倣することができます。

私のblogチェコ語)、私は与えられたメソッドリファレンスのメソッド名を取得するためにPowermockの内部関数を使用する方法を示しました。 Powermockitoと同じくらい快適ではありませんでした(実際は非常に苦痛でした)が、1回だけクラスローダーを再利用する必要がありました.2クラスローダー作業を実装してください(JavassistでClassUnderTestを調整する)、3利益:-)

とにかく私はそのようなコードの生産使用について警告します、それはむしろ遊んでいます。