実数を構築できることが確かに最善ThirdPartyObject
です。
このクラスを参照する必要があるため、このクラスを含むサード パーティ ライブラリがクラス パスに少なくともいくつかあります。ライブラリにもあるファクトリを使用するなど、それを構築する方法はありませんか? または、別のオブジェクトを構築し、プラグインをインスタンスで呼び出すメソッドを呼び出すことThirdPartyObject
によって?
これは統合テストと呼ばれることもありますが (メインアプリケーションとの統合をテストしているため)、テストがデータベースにデータを入れたり、他のことをしたりしない限り、古典的な意味での単体テストと見なすこともできます。他のテストに影響を与える可能性があります。
上記が不可能な場合は、MockitoThirdPartyObject
などを使用してモックアウトすることもできます。テスト コードが必要以上に実装に結合されていないことを確認してください。一部の人々は、クラスのすべての依存関係をモックアウトし、それらの依存関係に対するすべてのメソッド呼び出しを検証する必要があると考えています。彼らは多くの強力な結合と冗長性を導入しています。
あなたが言及した2つの問題に関して、両方を回避する方法があります:
ThirdPartyObject
1)インターフェースを実装することはできないと言います。それは本当ですが、このインターフェイスを実装し、ThirdPartyObject
. 次に、メイン アプリケーションによって呼び出されるメソッドは、このインターフェイスを使用する実際のプラグイン メソッドの実装に単純に委譲します。
例(ThirdPartyObject
単一のメソッドがあるとしますvoid thirdPartyMethodCall()
:
public interface InterfaceForThirdPartyObject {
void thirdPartyMethodCall();
}
public class ThirdPartyObjectAdapter implements InterfaceForThirdPartyObject {
private final ThirdPartyObject delegate;
public ThirdPartyObjectAdapter(ThirdPartyObject delegate) {
this.delegate = delegate;
}
public void thirdPartyMethodCall() {
delegate.thirdPartyMethodCall();
}
}
// your actual plugin implementation, not directly exposed to the main app
public class MyPlugin {
public PerSpecResponseObject myPluginFunction(InterfaceForThirdPartyObject iUseThis){
// this will contain your actual logic that you want to test
}
}
// this is the plugin as exposed to the main app
public class MyPluginAdapter implements PluginInterface {
private final MyPlugin delegate = new MyPlugin();
// this is called by the main application
public PerSpecResponseObject myPluginFunction(ThirdPartyObject iUseThis) {
delegate.myPluginFunction(new ThirdPartyObjectAdapter(iUseThis));
}
}
2) プラグインが の代わりに as メソッド引数ThirdPartyObject
を持つインターフェイスを実装しているため、サブクラス化できないと言います。なぜそれが問題になるのかわかりません: as パラメーターを取るメソッドは、 のサブクラスのインスタンスを問題なく受け取ります。ThirdPartyObject
? extends ThirdPartyObject
ThirdPartyObject
ThirdPartyObject