私にはそのような状況があります-私はインターフェース(たとえばMyInterface
)と単純な部分実装(AbstractMyInterface
)を持っています。後者は、私がテストしたいいくつかの保護されたメソッドを追加します。
AbstractMyInterface
現在、保護されたメソッドをパブリックとして拡張およびエクスポートするモックオブジェクトを手作業で作成しています。これを行う簡単な方法はありますか?たとえば、JMock +スクリプトを使用しますか?
私にはそのような状況があります-私はインターフェース(たとえばMyInterface
)と単純な部分実装(AbstractMyInterface
)を持っています。後者は、私がテストしたいいくつかの保護されたメソッドを追加します。
AbstractMyInterface
現在、保護されたメソッドをパブリックとして拡張およびエクスポートするモックオブジェクトを手作業で作成しています。これを行う簡単な方法はありますか?たとえば、JMock +スクリプトを使用しますか?
JUnitで保護されたメソッドをテストしても問題はありません。テストのパッケージ構造がソースツリー構造を反映している限り、private以外のメソッドがテストに表示されます。
もちろん、テストする実装が抽象的である場合は、テスト対象のクラスの通常のサブクラスを自分で作成する必要があります(または、目的に適している場合は、モックライブラリを介して作成する必要があります)。また、このような場合、保護された可視性メソッドを呼び出すためだけにパブリックメソッドのレイヤーを作成する必要はありません。プライベートメソッドの場合のみ、この戦略は機能しません。しかし、多くの場合、プライベートメソッドをテストする必要があるのは、とにかく設計上の問題の兆候です。
例:src / mypackage/AbstractClass.javaパッケージmypackageにあるテストするクラス。
/** This could as well implement some interface,
but that does not change a thing */
public abstract class AbstractClass {
protected int returnsOne() {
return 1;
}
}
そして、tests / mypackage/AbstractClassTest.javaにあるtest
package mypackage;
import org.junit.Test;
import static junit.framework.Assert.assertEquals;
public class AbstractClassTest {
@Test
public void returnsOneReturnsOne() {
AbstractClass instanceToTest = new AbstractClassTestable();
assertEquals(1, instanceToTest.returnsOne());
}
}
/** This is needed, because we cannot construct abstract class directly */
class AbstractClassTestable extends AbstractClass {
}
ただの提案、
保護されたメソッドをテストしない場合、パブリック メソッドを使用してそれらの保護されたメソッドをカバーできますか?
そうでない場合は、保護されたメソッドが複雑すぎるためか、リファクタリングして複雑なものを新しいオブジェクトに抽出し、パブリック インターフェイスを提供して、古いオブジェクトをいくつかのパブリック メソッドに 1 つのプライベート オブジェクトだけに残します。
テストは後で新しいオブジェクトに対して行われます。
このブログ投稿が役立つ場合があります。
インターフェイス(または抽象クラス)の抽象テストケースを作成できます。次に、インターフェイス (または抽象クラス) の具体的な実装ごとに抽象テスト ケースを拡張する具体的なテスト ケースを作成します。