12

我有一个通知参数的无效方法“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";

 ....
 }
}

如何在我的方法“motherFunction”的 JUnit 方法中模拟此方法?在我的示例中,“test”变量仍然为空。

@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

如果你想模拟motherFunctionthen 的返回结果,你不必担心方法的内部实现(最终调用functionVoid)。您需要做的是向Mockito提供有关在调用该方法时要做什么的指令motherFunction,这可以通过带有语法的when子句来实现;

    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(),你也可以让它返回一个String而不是void。

于 2014-07-23T03:17:58.390 回答
5

在我的示例中,“test”变量仍然为空。

这不是 Mockito 问题。

看看这个问题,尤其是这个答案

它的要点是 Java 是按值传递的(在上面的链接中对此进行了更好的解释)。test在 Mockito 或 Java 中,除了空字符串之外,没有任何东西能够使var 成为任何东西。方法调用前为空字符串,调用后为空字符串。

您可以在方法中更改对象的状态(例如,在方法中将对象添加到集合中)并在退出方法时查看这些更改,但您无法更改 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 方法时,此方法有效。

如果您的方法以某种方式修改了参数,那么您应该使用更改字符串的断言: 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 回答