0

私は、JUnit 抽象テストとして書かれた軽量のテスト フレームワークに相当するものを持っています。私がやりたいことは、実装するサブクラスにそれぞれカスタム テスト クラスのセットアップを定義させることです。私の計画は@BeforeClass、各サブクラスが強制的に定義する抽象設定メソッドを呼び出すメソッドを抽象スーパークラスに定義させることでしたが、@BeforeClassメソッドは静的でなければならず、静的メソッドを抽象にすることもインスタンスメソッドを呼び出すこともできないため、これは失敗します。

ドキュメントに必要なものを含めるか、 をスローすることによって、サブクラスがセットアップを行うと仮定することIllegalStateExceptionもできますが、いくつかの理由から、インターフェイス レベルでこれを強制できるようにしたいと考えています。誰でもこれを回避する方法を考えられますか?

ちなみに、これらのテストをパラメーター化する際にも同じ問題がありました (サブクラスはパラメーターを定義しますが、@Parameters注釈付きのメソッドは静的でなければなりません)。メソッドレベルのパラメーターを許可するサードパーティの JUnitParams ランナーを実行することで、これを回避しました。ここで確認してください: https://github.com/Pragmatists/JUnitParams

4

4 に答える 4

1

これは範囲外またはやり過ぎかもしれませんが、それほど違いはないので言及する価値があると思います。@BeforeClass でアノテーションが付けられたメソッドは静的である必要はなく、 @Parametersでアノテーションが付けられたメソッドも静的である必要はないため、TestNGを試してみることをお勧めします。

ここで2つのフレームワークの違いについて読むことができ、JUnitテストをTestNGに移行することもサポートしているようです

于 2013-11-06T21:04:01.777 に答える
1

これをきれいなオブジェクト指向の方法で行うことはできないと思います。@BeforeClassは静的メソッドであるだけでなく、JUnit は親のメソッドを@BeforeClass子のメソッドの前に呼び出します@BeforeClass

とにかく、これを実行しようとすると、必ず親クラスの内部静的状態を公開して、子クラスが親のフィールドを設定してカプセル化を破ることができるようにする必要があります。

@Beforeを使用するのが最善の方法だと思いますが、メソッドが以前に呼び出された場合に設定する静的フラグも設定します。これにより、少なくとも短絡して最初の呼び出しの初期化のみを行うことができます...

于 2013-11-06T21:05:02.600 に答える
1

1 つのオプションは、サブクラスに静的doSetupOnce()メソッドなどを実装させ、基本クラスのメソッドから反射的にそのメソッドを見つけて呼び出すこと@BeforeClassです。これは静的メソッドである必要があるため、その存在は実行時にのみ強制できます。

別のアプローチは、親のメソッドがdoSetupOnce最初に呼び出されたときに呼び出される基本クラスに抽象インスタンス メソッドを含めることです。@Beforeこれによりコンパイル時に問題が発生しますが、実装者はこのメソッドからインスタンス フィールドにアクセスしないように注意する必要があります (これはおそらく彼らが望んでいるものではないため)。

一般的に(そしてあなたの状況の詳細を知らなくても)、私はこれらのアプローチのどちらもあまり好きではなく、@BeforeClass必要に応じてメソッドを宣言することを実装者に任せたいと思います。それらを厳格な基底クラス スキームに閉じ込めると、解決するよりも多くの問題が発生する可能性があります。JUnit ルールの使用も検討してください。多くの場合、基本クラスよりも適切な選択です (構成可能であるためなど)。もちろん、2 つのアプローチを組み合わせることもできます。主に JUnit ルールに依存し、いくつかの基本クラスに便利な定義済みルールを追加で提供します。

于 2013-11-06T20:46:30.403 に答える