2

次のクラスを想像してください

public class ClassToBeTested{

  private AnotherClass otherClass;

  public void methodToBeTested(){
     otherClass = new AnotherClass();
     String temp = otherClass.someMethod()

    // ...some other code that depends on temp

  }

}

methodToBeTestedのインスタンスを受け入れるように設計されていれば、AnotherClass簡単に のモックを作成して、AnotherClass呼び出されたときに好みの値を返すように Mockito に指示できますsomeMethod()。ただし、上記のコードはAFAIKで設計されているため、モックを作成することはできずAnotherClass、このメソッドをテストすることは、何someMethod()が返されるかによって異なります。

someMethod()Mockitoまたは他のフレームワークを使用して返されるものに依存せずに、上記のコードをテストできる方法はありますか?

4

4 に答える 4

3

利用可能な場合は、SpringReflectionTestUtils setFieldメソッドを使用できます。

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/test/util/ReflectionTestUtils.html#setField%28java.lang.Object,%20java.lang.String,%20java。 lang.Object%29

リフレクションを使用して独自の非常に簡単な記述をしない場合は、ここにいくつかの情報があります。

http://www.java2s.com/Code/Java/Reflection/Setprivatefieldvalue.htm

以下のようなもので、これを正しく機能させるには、追加のエラー処理が必要になります。

public void setField(Object obj, String fieldName, Object value) {
    Field f = obj.getDeclaredField(fieldName);
    f.setAccessible(true);
    f.set(obj, value);
}

次に、次のように呼び出すことができます。

setField(objUnderTest, "fieldToSet", mockObject); 

編集

メソッド内でインスタンス化していることに気づきました。それが絶対に必要な場合は、cyroxxによって投稿された重複リンクの可能性をたどる必要があります。その慣習はしばしば悪いデザインの兆候ですが、あなたがそれを取り除くことができれば私はそうします。

于 2013-03-14T10:36:32.700 に答える
2

他の回答で提案されているように、リフレクションによってフィールドを設定すると機能します。

しかし、この種のことを頻繁に行う場合は、これを実現するために PowerMock (Mockito と組み合わせて) または JMockIt をお勧めします。どちらも、コンストラクター、静的、最終フィールドなどをモックすることができます。レガシ コードで非常に便利です。

ただし、新しいコードを作成していて、この方法で分離したい別のクラスにクラスが依存している場合は、他のオブジェクトがインスタンス化されるのではなく、クラスに渡されるように設計を変更することを検討する必要があります。それ。「依存性注入」を検索すると、たくさん見つかります...

于 2013-03-14T11:02:01.763 に答える
1

簡単な修正として、通常は次の呼び出しをラップしますnew

protected newAnotherClass() { return new AnotherClass(); }

そうすれば、単体テストからこのメソッドを上書きできます。汚れていますが、速いです:-)

于 2013-03-14T11:04:37.517 に答える
0

これは、非常に単純に、必要なことを行うJMockitテストです。

@Test
public void testTheMethodToBeTested(@Mocked final AnotherClass dep)
{
    new NonStrictExpectations() {{ dep.someMethod(); result = "whatever"; }};

    new ClassToBeTested().methodToBeTested();

    new Verifications() {{
        // verify other calls to `dep`, if applicable...
    }};
}
于 2013-03-14T16:05:01.540 に答える