インターフェイスとそれを実装するすべてのオブジェクトをテストする必要があります
-
29-09-2019 - |
質問
こんにちは、Aを実装するインターフェイスAとクラスBがあると仮定します。テストクラス内で、Aを実装するダミークラスを作成し、「インターフェイスメソッドをテストする」次の質問は、クラスBが「取得する」方法をテストした場合です。インターフェイスから。
解決
私の経験では、コンクリートクラスとインターフェイスとの相互作用をテストするだけです。
つまり、Aを実装する具体的なクラスBがある場合、Bとそれが参照する他のオブジェクトとの相互作用をテストするだけです。
他のヒント
通常、テストするには、すべての(実行可能ファイル)コード行に触れる必要があります。インターフェイスを実装している場合、インターフェイスの「契約」を形成するテストをコーディングできるため、インターフェイスのすべての実装者にテストが適用されるため、はるかに簡単になります。
これにより、すべての実装者の一貫性が保証されます。実装者の動作が異なる状況に遭遇した場合(例:nullreferenceException vs. argumentNullexception)、「正しい」と間違っているものを指定するテストを追加できます。これにより、路上での驚きが少なくなります。
すべてのインターフェイスには、予想される動作を説明するために添付されている一連のテストが必要だと言っている限りです。
もちろん、コンクリートの実装者でのみテストできる実装固有のものがあります(例:「ファイルは書かれていましたか?」vs.「レコードはコミットされましたか?」)。これらのことは、オーバーライドまたはラムダを介してインターフェイスのテストスイートに提供する必要があります。
はい、テストで100%のコードカバレッジを取得することを目指してください
インターフェイスには具体的な実装はないはずなので、定義上テストするものがないため、テストする必要はありません。テストは、インターフェイスの具体的な実装のためのものでなければなりません。
インターフェイスの部分的な実装を必要とする状況に自分自身を見つけた場合、あなたは私がしていることをすることができます。たとえば、アイテムのインターフェイスがあるとします。これを呼びます IItem
すべてのインターフェイスがあります。それから私は宣言します Item
これは、共通コードのインターフェイスの部分的な実装であり、次に ItemA
, ItemB
, などの専門化のため Item
.
私はあなたのすべての投稿を読みましたIIこのソリューションは最もうまくいくと思います。
Interface A
{
String A1();
String A2();
}
public class B:A
{
String A1(){return "A1"}
String A2(){return "A2"}
}
public class testB
{
public void B_Can_Return_A1()
{
A b=new B();
Assert.True(b.A1=="A1")
}
}
しかし、具体的な実装がまだ確実に依存しているというインターフェイスからメソッドを削除している場合、インターフェイスのその部分を削除するべきではありませんか?
これは本当ですが、これはまだテストで実施する必要があります。インターフェイス(すべき)は、開発に大きな役割を果たし、変化はラインで大きな問題を引き起こす可能性があります。オブジェクトがインターフェイスを実装している場合、これがどのようにテストされるべきか、または同様のものだと思います。
これについてコメントしてください。