12

パラメータを通知するvoidメソッド「functionVoid」があります。

public class MyMotherClass {
 @Inject
 MyClass2 myClass2

 public String motherFunction(){
  ....
  String test = "";
  myClass2.functionVoid(test);

  if (test.equals("")) {
      IllegalArgumentException ile = new IllegalArgumentException(
      "Argument is not valid");
      logger.throwing(ile);
      throw ile;
  }
  ....
 }
}

public class MyClass2 {

public void functionVoid(String output_value)
{ ....
 output_value = "test";

 ....
 }
}

JUnit メソッド my メソッド「motherFunction」でこのメソッドをモックするにはどうすればよいですか? 私の例では、「テスト」変数はまだ空です。

@RunWith(MockitoJUnitRunner.class)
public class MyMotherClassTest {

 @Mock
 private MyClass2 myClass2 ;

 @InjectMock
 private final MyMotherClass myMotherClass = new MyMotherClass ();

 @Test
 public void test(){

  myMotherClass.motherFunction();     

 }
}
4

4 に答える 4

19

の戻り結果をモックしたい場合motherFunctionは、メソッドの内部実装について心配する必要はありません (最終的に を呼び出しfunctionVoidます)。あなたがする必要があるのは、メソッドが呼び出されたときに何をすべきかについての指示をMockitoに提供することです。これは、構文のwhen句をmotherFunction介して実現できます。

    when(mockedObject.motherFunction()).thenReturn("Any old string");

それがあなたが達成しようとしていることの要点を逃した場合は、ドキュメントでvoid メソッドをモックする方法をdoAnswer見て、の使用がここで適用可能かどうかを判断してください。

doAnswer(new Answer<Void>() {

  @Override
  public Void answer(InvocationOnMock invocation) throws Throwable {
    String output_value = invocation.getArguments()[0];
    output_value = "Not blank";
    return null;
  }
}).when(myClass2).functionVoid(anyString());
于 2013-01-29T12:24:42.017 に答える
7

functionVoid() を変更して可変オブジェクトをパラメーターとして受け入れることができれば、目的を達成できるはずです。

たとえば、functionVoid() を次のように変更するとします。

public void functionVoid(StringBuilder output_value)
{ ....
 output_value.append("test");

 ....
 }

次のように、motherFunction で呼び出します。

public String motherFunction(){
  ....
  StringBuilder test = new StringBuilder();
  myClass2.functionVoid(test);

  if (test.toString().equals("")) {

上記のOceanLifeの回答を変更すると、次のことができるはずです。

doAnswer(new Answer<Void>() {

  @Override
  public Void answer(InvocationOnMock invocation) throws Throwable {
    StringBuilder output_value = invocation.getArguments()[0];
    output_value.append("Not blank");
    return null;
  }
}).when(myClass2).functionVoid(any(StringBuilder.class)); 

もちろん、functionVoid() を変更できる場合は、void ではなく String を返すようにすることもできます。

于 2014-07-23T03:17:58.390 に答える
5

私の例では、「テスト」変数はまだ空です。

これは Mockito の問題ではありません。

この質問、特にこの回答を見てください。

その要点は、Java が値渡しであるということです (これは、上記のリンクではるかによく説明されています)。Mockito または Java では、testvar を空の文字列以外にすることはできません。メソッド呼び出し前は空の文字列で、呼び出し後は空の文字列になります。

メソッド内でオブジェクトの状態を変更し (メソッド内のコレクションにオブジェクトを追加するなど)、メソッドを終了するときにそれらの変更を確認できますが、メソッド内で var が参照するオブジェクトを変更して、それらの変更が「固定」されることを期待することはできません。メソッドを終了したら。ただし、文字列は事実上不変 (変更する状態がない) であるため、これを行うことさえできません。

testしたがって、そのメソッド呼び出し内で変更を行うことはできません。

于 2013-01-30T20:43:37.500 に答える
0

オブジェクト Obj のメソッド someMethod(String arg) をチェックしたい場合:

String argument = "";
Mockito.verify(Obj, Mockito.times(1)).someMethod(argument);

Obj は Mock または Spy でなければなりません。これは、void メソッドに適切な引数が渡されたかどうかを確認したい場合に機能します。

メソッドがなんらかの引数を変更する場合は、文字列を変更する assertion: someMethod(StringWrapper wrapper) を使用する必要があります。

// given
String argument = "a";
String expected = "a_changed";
String wrapped = new StringWrapper(a);

// when
someMethod(wrapped);

// then
Assert.assertEquals(wrapped.getString(), expected)

これがあなたが探していたものかどうかわかりませんか?

于 2014-10-31T09:09:08.480 に答える