2012-04-11 23 views
0

テストクラスを拡張せずにスーパークラスにメソッド(リフレクションを使用して)を挿入する方法はありますか? someMethod()内のロジックをテストするには、getExternalData()を置き換える必要があります。私はテストされたクラスを変更することはできません - 私はメソッドを注入することを考えていたので。Javaのテスト済みクラスにメソッドを挿入するには?

public class B extends A{ 
    public String someMethod(){ 
    String someString = super.getExternalData(); 
    //logic to be tested - manipulating on someString 
    return someString; 
    } 
} 

public class A{ 
    public String getExternalData(){ 
    //some Logic that generates "externalData" string 
    return externalData; 
    } 
} 

とテスト:

public class CesTest{ 
    @Test 
    public void someMethodTest()(
    B instance = new B(); 
    //... 
    //... 
    assertEquals("expectedData", instance.someMethod()); 
    } 
} 
+3

可能な複製:http://stackoverflow.com/questions/3467801/mockito-how-to-mock-only-the-call-of-a-method-of-the -superclass –

答えて

1

シンプルな答えはあなたには、いくつかの本当に奇妙なものをやってなくてそれはあなたがテスト中のクラスをテストしていないことになることができないです

は私が流れるのクラスを持っていますテスト中のクラスのいくつかの奇妙な模擬バージョンです。 getExternalDataに適切な値を返すために必要な設定を行う必要があります。つまり、class Aは、mockを注入して、これを外部リソースに当てずにexternal dataにすることができるというような形で書かれていなければなりません。

0

理由)

super.getExternalData() 

だけではなく、

getExternalData() 

これは(あなたがBを拡張してみましょうとgetExternalDataを上書きしますを使用して

+0

これはクラスの邪魔になりますが、コードを変更することはできません - ユニットテストを書いてください – Marcin

+2

その場合、AOPまたはリフレクションを使用する必要があります。それはどんなやり方でも汚くなります。だからこそ、私たちは「あなたがそれをテストすることができない場合、あなたのデザインに何か問題があります」と言います。 – shem

+0

あなたのコメントを延長することができますか?この場合の反射やAOPの使い方は? – Marcin

0
public class B extends A{ 
    public String someMethod(){ 
    String someString = getExternalData(); //without 'super' 
    //logic to be tested - manipulating on someString 
    return someString; 
    } 
    @Override 
    public String getExternalData(){ 
    //Overriding code 
    return externalData; 
    } 
} 

public class A{ 
    public String getExternalData(){ 
    //some Logic that generates "externalData" string 
    return externalData; 
    } 
} 

これはあなたを助けましたか?

+0

私はテストされたクラスを変更することはできません - そのため、私は注射方法について考えていました。 Bクラスを拡張するオプションがありますが、可能ならばこれを避けたい – Marcin

0

(私の英語についてSRY)

こんにちはマルチン、

私は10時55分で、4月11日にあなたに答えたが、uが解決アレント場合、私はJUnitのレッスンを取得した後、私は、よりよい解決策を持っていますこれはまだ:

Fisrt to Allでは、TestClassはあなたのケースでは、BTestというsufix "Test"を持つSUT(Subject Under Test)として慣習的に呼び出されなければなりません。

第2に、JUnitでは、コラボレータメソッドを変更するためにMockクラスを使用することがよくあります(コラボレータはSUTに依存するクラスです)。より良い選択は、GoogleコードのMockito、無料でjUnitのより良いAPIを使用することです。それを使用:

public class BTest{ 
    @Test 
    public void someMethod()(
    B instance = new B(); 
    when(instance.getExternalData()).thenReturn("expectedData"); 
    assertEquals("expectedData", instance.someMethod()); 
    } 
} 

http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html Google Code Rules!それが私の答えを投票した場合、

関連する問題