Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mockito语法,用于在Java Junit中使用何时存根返回值_Java_Testing_Junit_Mockito - Fatal编程技术网

Mockito语法,用于在Java Junit中使用何时存根返回值

Mockito语法,用于在Java Junit中使用何时存根返回值,java,testing,junit,mockito,Java,Testing,Junit,Mockito,我有一个计算器界面: public interface ICalculator { public double evaluate(String expression); } public interface IView { public void appendAnswer(double anwer); } 我还有一个视图界面: public interface ICalculator { public double evaluate(String expression); } public

我有一个计算器界面:

public interface ICalculator {
public double evaluate(String expression);
}
public interface IView {
public void appendAnswer(double anwer);
}
我还有一个视图界面:

public interface ICalculator {
public double evaluate(String expression);
}
public interface IView {
public void appendAnswer(double anwer);
}
我的控制器类有一个方法:

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);
}
“预期iView.appendAnswer(2.0),实际iView.appendAnswer(0.0)”失败。 试图找到答案让我相信在setup()参数中需要when子句,
但我一直搞不懂语法

你嘲笑了你的计算器

calculator = mock(ICalculator.class);
它的所有方法都将返回一些默认值,
null
用于大多数引用类型,
0
用于数字类型,而
false
用于
布尔值

如果希望这些方法返回一个预设值,则需要将它们存根。你可以用
Mockito#when(Object)
来实现这一点

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

calculator.evaluate(inputExpression)
当给定任何
字符串
值时,返回
2.0
的求值方法

你可以用它来做

Mockito.when(calculator.evaluate(Mockito.any(String.class))).thenReturn(2.0);
或者,如果您已经知道将传递哪个
字符串
值,则可以直接使用该值

String expression = ...;
Mockito.when(calculator.evaluate(expression)).thenReturn(2.0);
在这种情况下,您可以验证是否使用正确的值调用了
evaluate

verify(calculator).evaluate(expression);

根据您的评论,您需要一个大致相同的
答案

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;
    }
});
Mockito.when(calculator.evaluate(Mockito.any(String.class))).thenAnswer(new-Answer(){
@凌驾
公共双应答(invocationMock调用)抛出可丢弃的{
字符串参数=invocation.getArgumentAt(0,String.class);
Double returnValue=Double.parseDouble(参数);
返回值;
}
});

你已经嘲笑了你的计算器

calculator = mock(ICalculator.class);
它的所有方法都将返回一些默认值,
null
用于大多数引用类型,
0
用于数字类型,而
false
用于
布尔值

如果希望这些方法返回一个预设值,则需要将它们存根。你可以用
Mockito#when(Object)
来实现这一点

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

calculator.evaluate(inputExpression)
当给定任何
字符串
值时,返回
2.0
的求值方法

你可以用它来做

Mockito.when(calculator.evaluate(Mockito.any(String.class))).thenReturn(2.0);
或者,如果您已经知道将传递哪个
字符串
值,则可以直接使用该值

String expression = ...;
Mockito.when(calculator.evaluate(expression)).thenReturn(2.0);
在这种情况下,您可以验证是否使用正确的值调用了
evaluate

verify(calculator).evaluate(expression);

根据您的评论,您需要一个大致相同的
答案

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;
    }
});
Mockito.when(calculator.evaluate(Mockito.any(String.class))).thenAnswer(new-Answer(){
@凌驾
公共双应答(invocationMock调用)抛出可丢弃的{
字符串参数=invocation.getArgumentAt(0,String.class);
Double returnValue=Double.parseDouble(参数);
返回值;
}
});

首先,您应该在以下情况下使用定义模拟的行为:

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注释)

首先,您应该在以下情况下定义Mock的行为:

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注释)

我希望找到一种方法,让Mockito返回与它传递的字符串对应的double,如get-thenReturn返回字符串上的double.parseDouble。因此,如果通过“3.0”,它将返回3.0等,而不仅仅是硬编码的2.0。这可能吗?@Saf它怎么会知道?这是非常习惯的行为。你已经创建了一个模拟。根据定义,这是一个没有定义行为的愚蠢对象。是的,你可以使用andAnswer()而不是andReturn(),但同意@SotiriosDelimanolis为什么要重新实现模拟行为?@Sotirios看起来可以使用,但我无法调整语法并使其生效work@Saf我添加了一个示例。但并不是说对
double
值的相等性比较并不总是精确的。我希望找到一种方法,让mockito返回与它传递的字符串对应的double,就像get thenReturn返回字符串上的double.parseDouble一样。因此,如果通过“3.0”,它将返回3.0等,而不仅仅是硬编码的2.0。这可能吗?@Saf它怎么会知道?这是非常习惯的行为。你已经创建了一个模拟。根据定义,这是一个没有定义行为的愚蠢对象。是的,你可以使用andAnswer()而不是andReturn(),但同意@SotiriosDelimanolis为什么要重新实现模拟行为?@Sotirios看起来可以使用,但我无法调整语法并使其生效work@Saf我添加了一个示例。但并不是说对
double
值的相等性比较并不总是精确的。