2017-01-27 11 views
0

私は抽象クラスの単体テストを作成しようとしています。具体的には、私はReflectionを使用して抽象メソッドのprotectedメソッドを呼び出す方法は?

public abstract class MyAbstractClass 
{ 
    // ... 
    private Something _myPrivateVariable; 
    // ... 
    protected void MyProtectedMethod(string[] names) { // ... } 
    // ... 
} 

ようなクラスを持っていると私はパラメータでMyProtectedVoidを呼び出した後、_myPrivateVariableが特定の値に設定されたことを確認します。

私はHow do I use reflection to invoke a private method?に似GetMethodを使用して、クラスのインスタンスのprivateメソッドを呼び出す方法を知っているが、私はインスタンスを作成することができないことを考慮abstractクラスとの事、このタイプの方法がわかりませんそれの。

+0

RhinoMockを使用して、つまりモザイクを試しましたか?例:http://stackoverflow.com/questions/6960459/rhino-mock-an-abstract-class-w-o-mocking-its-virtual-method – MistyK

+0

UTのプライベート変数をチェックしないでください。 http://stackoverflow.com/questions/1093020/unit-testing-and-checking-private-variable-valueなど多くの点をチェックしてください。 – qxg

答えて

0

Callerは、保護されたメソッドを抽象クラスから呼び出そうとしているクラスであるとします。この場合、あなたはそれはあなたがそれの新しいインスタンスを作成することができないので、抽象クラスを継承する必要があります:

public abstract class MyAbstractClass 
    { 
    // ... 
    private Something _myPrivateVariable; 
    // ... 
    protected void MyProtectedMethod(string[] names) { // ... } 
    // ... 
    } 

public class Caller:MyAbstractClass // inheriting the abstract class 
{ 
    public void GetAbstractMethod(){ 
    MyProtectedMethod(/*string[] values*/); 
    } 
    } 
0

あなたは存在しないオブジェクトのメソッドを呼び出すことはできませんし、抽象クラス自体は作成できません。

しかし、あなたは実際にはかなり単純な問題を解決しようとしています。抽象クラスのメソッドをテストしたいだけなので、抽象クラスを継承するテストクラスを作成し、テストに失敗して抽象メソッドを「実装」することができます。次に、テストクラスを使用して、抽象クラスとその保護されたメソッドとフィールドをテストできます。

public class MyAbstractTestClass : MyAbstractClass 
{ 
    public void TestProtectedMethod(string[] names) 
    { 
     Assert... 
     this.MyProtectedMethod(names); 
     Assert... 
    } 
} 

これは、あなたがルーチンを呼び出すことができます、あなたが保護されたメソッドとフィールドにアクセスすることができます、そして、あなたのユニットテストでテストクラスを宣言するために、あなたは他のコードには影響を与えません。このアプローチでは、テストコードを更新せずに抽象基本クラスが変更される場合もあります。

関連する問題