2011-12-04 8 views
4

私はこのような状況があります - 私はインターフェイス(例えばMyInterface)と単純な部分実装(AbstractMyInterface)を持っています。後者は、私がテストしたいいくつかの保護されたメソッドを追加します。JUnitとJMockを使用して抽象クラスの保護されたメソッドをテストする方法

現在のところ、AbstractMyInterfaceを拡張して保護されたメソッドをpublicとしてエクスポートするモックオブジェクトを手作業で記述します。これを行う簡単な方法がありますか?たとえば、JMock +スクリプトを使用していますか?

答えて

6

JUnitで保護されたメソッドをテストする際に問題はありません。テスト用のパッケージ構造がソースツリー構造を反映している限り、プライベート以外のメソッドもテスト用に表示されます。

もちろん、テストの実装が抽象的である場合は、自分でテストするクラスの通常のサブクラスを作成する必要があります(目的に合っていれば、いくつかの模擬ライブラリで行う必要があります)。このような場合でも、保護された可視性メソッドを呼び出すためのパブリックメソッドのレイヤーを作成する必要はありません。プライベートメソッドの場合にのみ、この戦略は機能しません。しかし、しばしばプライベートメソッドをテストする必要がありますとにかくデザインの問題の兆候です。

例: src/mypackage/AbstractClass.javaにあるテスト対象クラス パッケージmypackage;テスト/ mypackageと/ AbstractClassTest.java

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 { 
} 
+0

テストで使用されていないスタブのリストが増えていることを除いて問題はありません。 –

0

に位置しています

/** This could as well implement some interface, 
    but that does not change a thing */ 
public class AbstractClass { 
    protected int returnsOne() { 
     return 1; 
    } 
} 

とテストは、インターフェイス(または抽象クラス)の抽象テストケースを作ることができます。インターフェイス(または抽象クラス)の具体的な実装ごとに抽象テストケースを拡張する具体的なテストケースを作成します。

3

だけの提案、我々は保護されたメソッドをテストしていない場合、我々はそれらの保護されたメソッドをカバーするために、パブリックメソッドを使用することができますどのような

もしそうでなければ、保護されたメソッドが複雑すぎるため、複雑なものを新しいオブジェクトに抽出するためのリファクタが公開インタフェースを提供し、古いオブジェクトをいくつかのパブリックメソッドに1つのプライベートオブジェクトとして残します。

テストは後で新しいオブジェクトになります。

このblog postが役立つ可能性があります。

+0

いいえ - 保護されたメソッドは非常に単純ですが、パブリックAPI(単純なパブリッシュ/サブスクライブモデルの一部)に継承されています。パーツはパブリックメソッドで使用されますが、動作するかどうかをテストするために保護された部分にアクセスする必要があります。ポストの時点で私は私的なメソッドはテストすべきではないが、他のメソッドによって保護されたメソッドが使われることに同意する。 –

+0

パブリックメソッドは保護されたメソッドをラップするパブリックAPIにアクセスする必要があり、このクラスは2つのミッションを持つようです。パブリックAPIを隠すラッパークラスと、ラッパーが提供するサービスを使用するユーザークラスを設計します。したがって、APIが変更される場合でも、ロジックがいっぱいになる可能性のあるユーザークラスには害はありません。私が10年生涯のCコードを単体テストすることで学んだのは、単体テストを行うのが難しい場合、それを残して、リファクタリングするコードが簡単で良いRoIの方法です。 –

+0

Chris Zheng:publish subscribeを使用する簡単なコードではそれを表示できますか?パブリックメソッドはオブザーバを登録/登録解除するだけで、保護されたメソッドはさまざまなイベントを発生させます(オブザーバをループして通知イベントを送信する)。私は、あなたが描く方法でそれを行い、キスのルールに違反しない解決策を見逃す。 –

関連する問題