我有一个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 方法中模拟此方法,我的方法"母函数"?在我的示例中,"test"变量仍然是空的。
@RunWith(MockitoJUnitRunner.class)
public class MyMotherClassTest {
@Mock
private MyClass2 myClass2 ;
@InjectMock
private final MyMotherClass myMotherClass = new MyMotherClass ();
@Test
public void test(){
myMotherClass.motherFunction();
}
}
模拟motherFunction
的返回结果,那么你不必担心方法的内部实现(最终调用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());
如果你可以更改 functionVoid() 以接受可变对象作为参数,那么你应该能够实现你想要的。
例如,如果您按如下方式更改 functionVoid():
public void functionVoid(StringBuilder output_value)
{ ....
output_value.append("test");
....
}
并在你的母函数中调用它,如下所示:
public String motherFunction(){
....
StringBuilder test = new StringBuilder();
myClass2.functionVoid(test);
if (test.toString().equals("")) {
现在修改上面的海洋生物的答案,您应该能够执行以下操作:
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。
在我的示例中,"test"变量仍然是空的。
这不是一个莫皮托问题。
看看这个问题,尤其是这个答案。
它的要点是Java是按值传递的(这在上面的链接中得到了更好的解释)。 在 Mockito 或 Java 中,除了空字符串之外,没有任何内容能够使 test
var 成为任何其他内容。 它在方法调用之前是一个空字符串,在调用之后将是一个空字符串。
对象的状态(例如,将对象添加到方法中的集合中),并在退出方法时看到这些更改,但您无法更改 var 在方法中引用的对象,并期望这些更改在退出方法后"粘住"。 但是,字符串实际上是不可变的(没有要更改的状态),因此您甚至无法执行此操作。
因此,在该方法调用中无法对test
进行任何修改。
如果你想检查对象 Obj 的方法 someMethod(String arg),那么:
String argument = "";
Mockito.verify(Obj, Mockito.times(1)).someMethod(argument);
Obj 必须是模拟或间谍。当您想检查是否将正确的参数传递给 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)
我不确定这是否是你要找的?