使用 When to stub return values Java Junit 的 Mockito 语法
Mockito syntax for using When to stub return values Java Junit
我有一个计算器界面:
public interface ICalculator {
public double evaluate(String expression);
}
我还有一个View界面:
public interface IView {
public void appendAnswer(double anwer);
}
我的控制器class有一个方法:
public void handle(String inputExpression) {
view.appendAnswer(calculator.evaluate(inputExpression));
}
我正在尝试使用 Mockito 创建 handle 的单元测试。
private Controller controller;
@Mock
ICalculator calculator;
IView view;
@Before
public void setup() {
controller = new Controller();
calculator = mock(ICalculator.class);
view = mock(IView.class);
controller.setCalculator(calculator);
controller.setView(view);
//need a when here?
我需要测试的是,当 void 方法句柄接收到一个字符串时,
view.appendAnswer 使用相应的双参数调用。
@Test
public void testControllerHandleMethodCallsViewAppendAnswerMethodPassingADouble() {
controller.handle("2.0");
verify(view, times(1)).appendAnswer(2.0);
}
"Expected iView.appendAnswer(2.0), actual iView.appendAnswer(0.0)" 失败。
试图找到答案让我相信我的 setup() 参数中需要一个 when 子句,
但我一直无法弄清楚语法。
你嘲笑了你的计算器
calculator = mock(ICalculator.class);
它的所有方法都会return一些默认值,null
用于大多数引用类型,0
用于数值类型,false
用于boolean
。
如果你想让这些方法return一个预设值,你需要存根它们。您可以使用 Mockito#when(Object)
.
Mockito.when(calculator.someMethod()).thenXyz()
Xyz 取决于你想做什么。在这种情况下,我假设你想要
calculator.evaluate(inputExpression)
给定任何 String
值时 return 2.0
的评估方法。
你可以用
Mockito.when(calculator.evaluate(Mockito.any(String.class))).thenReturn(2.0);
或者,如果您已经知道要传递哪个 String
值,则可以直接使用它
String expression = ...;
Mockito.when(calculator.evaluate(expression)).thenReturn(2.0);
在这种情况下,您可以验证 evaluate
是使用正确的值
调用的
verify(calculator).evaluate(expression);
根据您的评论,您需要 Answer
或多或少类似于
Mockito.when(calculator.evaluate(Mockito.any(String.class))).thenAnswer(new Answer<Double>() {
@Override
public Double answer(InvocationOnMock invocation) throws Throwable {
String argument = invocation.getArgumentAt(0, String.class);
Double returnValue = Double.parseDouble(argument);
return returnValue;
}
});
首先,您应该使用 when:
定义模拟的行为
when(calculator.evaluate(anyString()))
.thenReturn(2.0);
那么要测试的单元应该叫:
controller.handle("2.0");
之后验证模拟调用是否正确:
verify(calculator).evaluate(eq("2.0"));
verify(view).appendAnswer(eq(2.0));
(使用了很多来自 Mockito 的静态导入,顺便说一句:未使用 @Mock 注释)
我有一个计算器界面:
public interface ICalculator {
public double evaluate(String expression);
}
我还有一个View界面:
public interface IView {
public void appendAnswer(double anwer);
}
我的控制器class有一个方法:
public void handle(String inputExpression) {
view.appendAnswer(calculator.evaluate(inputExpression));
}
我正在尝试使用 Mockito 创建 handle 的单元测试。
private Controller controller;
@Mock
ICalculator calculator;
IView view;
@Before
public void setup() {
controller = new Controller();
calculator = mock(ICalculator.class);
view = mock(IView.class);
controller.setCalculator(calculator);
controller.setView(view);
//need a when here?
我需要测试的是,当 void 方法句柄接收到一个字符串时, view.appendAnswer 使用相应的双参数调用。
@Test
public void testControllerHandleMethodCallsViewAppendAnswerMethodPassingADouble() {
controller.handle("2.0");
verify(view, times(1)).appendAnswer(2.0);
}
"Expected iView.appendAnswer(2.0), actual iView.appendAnswer(0.0)" 失败。 试图找到答案让我相信我的 setup() 参数中需要一个 when 子句, 但我一直无法弄清楚语法。
你嘲笑了你的计算器
calculator = mock(ICalculator.class);
它的所有方法都会return一些默认值,null
用于大多数引用类型,0
用于数值类型,false
用于boolean
。
如果你想让这些方法return一个预设值,你需要存根它们。您可以使用 Mockito#when(Object)
.
Mockito.when(calculator.someMethod()).thenXyz()
Xyz 取决于你想做什么。在这种情况下,我假设你想要
calculator.evaluate(inputExpression)
给定任何 String
值时 return 2.0
的评估方法。
你可以用
Mockito.when(calculator.evaluate(Mockito.any(String.class))).thenReturn(2.0);
或者,如果您已经知道要传递哪个 String
值,则可以直接使用它
String expression = ...;
Mockito.when(calculator.evaluate(expression)).thenReturn(2.0);
在这种情况下,您可以验证 evaluate
是使用正确的值
verify(calculator).evaluate(expression);
根据您的评论,您需要 Answer
或多或少类似于
Mockito.when(calculator.evaluate(Mockito.any(String.class))).thenAnswer(new Answer<Double>() {
@Override
public Double answer(InvocationOnMock invocation) throws Throwable {
String argument = invocation.getArgumentAt(0, String.class);
Double returnValue = Double.parseDouble(argument);
return returnValue;
}
});
首先,您应该使用 when:
定义模拟的行为when(calculator.evaluate(anyString()))
.thenReturn(2.0);
那么要测试的单元应该叫:
controller.handle("2.0");
之后验证模拟调用是否正确:
verify(calculator).evaluate(eq("2.0"));
verify(view).appendAnswer(eq(2.0));
(使用了很多来自 Mockito 的静态导入,顺便说一句:未使用 @Mock 注释)