0

テストされたクラスを拡張せずに、メソッドを(リフレクションを使用して)スーパークラスに注入するにはどうすればよいですか? getExternalData()内部のロジックをテストするために交換する必要がありsomeMethod()ます。テストしたクラスを変更することはできません。そのため、メソッドの注入を考えていました。

私は流れるクラスを持っています:

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());
  }
}
4

4 に答える 4

1

簡単な答えは、テスト対象のクラスをテストせず、テスト対象のクラスの奇妙なモックアウトバージョンをテストするという、本当に奇妙なことをしなければならないということです。getExternalData適切な値を返すために必要なセットアップを行う必要があります。そうは言っても、外部リソースにぶつかることなくこれを提供するためclass Aにamockを注入できるように書く必要があります。external data

于 2012-04-11T10:54:12.497 に答える
0

(私の英語についてsry)

こんにちはマーシン、

4月11日の10:55に回答しましたが、junitのレッスンを受けた後、u arentがまだ解決していれば、より良い解決策があります。

すべてに最初に、TestClassは、慣例により、接尾辞「Test」(この場合はBTest)を使用してSUT(Subject Under Test)として呼び出す必要があります。

次に、JUnitでは、モッククラスを使用してCollaboratorsメソッドを変更することがよくあります(CollaboratorはSUTとの依存関係を引き起こすクラスです)。より良い選択は、Google Codeの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コードルール!それがうまくいけば私の答えに投票してください、ありがとう

于 2012-05-14T12:44:35.720 に答える
0

なぜ使用するのか

super.getExternalData()

だけでなく

getExternalData()

これにより、Bを拡張し、getExternalData()をオーバーライドできます。

于 2012-04-11T10:54:53.377 に答える
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;
  }
}

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

于 2012-04-11T10:55:56.707 に答える