繁体   English   中英

使用何时对返回值进行存根的Mockito语法Java Junit

[英]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);
}

我的Controller类有一个方法:

public void handle(String inputExpression) {
    view.appendAnswer(calculator.evaluate(inputExpression));
} 

我正在尝试使用Mockito创建用于句柄的单元测试。

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方法句柄接收到String时,将使用相应的double参数调用view.appendAnswer。

@Test
public void testControllerHandleMethodCallsViewAppendAnswerMethodPassingADouble() {
    controller.handle("2.0");
    verify(view, times(1)).appendAnswer(2.0);
}

出现“预期的iView.appendAnswer(2.0),实际的iView.appendAnswer(0.0)”失败。 试图找到答案使我相信我需要在setup()参数中使用when子句,但是我一直无法弄清楚语法。

你嘲笑你的计算器

calculator = mock(ICalculator.class);

它的所有方法都将返回一些默认值,对于大多数引用类型,该参数将返回null ,对于数字类型,该参数将返回0 ,对于boolean ,其返回false

如果希望这些方法返回预设值,则需要对它们进行存根。 您可以使用Mockito#when(Object)做到这Mockito#when(Object)

Mockito.when(calculator.someMethod()).thenXyz()

Xyz取决于您要做什么。 在这种情况下,我假设您要

calculator.evaluate(inputExpression)

给定任何String值时,评估方法返回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(calculator.evaluate(anyString()))
  .thenReturn(2.0);

然后应将要测试的单元称为:

controller.handle("2.0");

然后验证模拟是否正确:

verify(calculator).evaluate(eq("2.0"));
verify(view).appendAnswer(eq(2.0));

(使用了许多来自Mockito的静态导入,顺便说一句:@Mock注释未使用)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM