Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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
Java mocktio验证参数顺序_Java_Testing_Mockito - Fatal编程技术网

Java mocktio验证参数顺序

Java mocktio验证参数顺序,java,testing,mockito,Java,Testing,Mockito,我已经找了一段时间了,没有答案 假设我有一个类服务,它使用计算依赖项 Calc有一个方法divide public void divide(int a,int b) 而服务就是这样使用它的 public void serviceAMethod{ //do somehting a=getA(); b=getB(); calc.divide(a,b); } 我的测试是这样的 @Test public void serviceAMethod_callsCalc(){ verify(calcM

我已经找了一段时间了,没有答案

假设我有一个类服务,它使用计算依赖项

Calc有一个方法divide

public void divide(int a,int b)
服务就是这样使用它的

public void serviceAMethod{
//do somehting
a=getA();
b=getB();
calc.divide(a,b);
}
我的测试是这样的

@Test
public void serviceAMethod_callsCalc(){
   verify(calcMock).divide(a, b);
}
这是通过的,但是如果我转到计算除法并将签名更改为

public void divide(int b,int a)
它还是过去了

如何测试以正确的顺序传递正确的参数


编辑:不必使用Mockito,如何使此测试更具弹性?

这是因为传递到Calc.divide的值仍然相同。Mockito验证传递的值,而不是参数的名称。因此,更改Calc类中参数的顺序不会影响测试,除非您更改方法ServiceMethod中完成的调用以反映更改

public void serviceAMethod() {
  //do somehting
  a=getA();
  b=getB();
  calc.divide(b,a);
}
只有在您更改此逻辑(即您正在测试的逻辑)后,您的测试才会失败

如果使用实际值,则可以看到:

public void serviceAMethod() {
   a=getA(); // EG: 1 
   b=getB(); // EG: 2
   calc.divide(1, 2); // effective call
}
如果在Calc类中交换a和b,仍将使用值1、2调用它。然后测试以下各项:

verify(calcMock).divide(1, 2);

这是因为传递到Calc.divide的值仍然相同。Mockito验证传递的值,而不是参数的名称。因此,更改Calc类中参数的顺序不会影响测试,除非您更改方法ServiceMethod中完成的调用以反映更改

public void serviceAMethod() {
  //do somehting
  a=getA();
  b=getB();
  calc.divide(b,a);
}
只有在您更改此逻辑(即您正在测试的逻辑)后,您的测试才会失败

如果使用实际值,则可以看到:

public void serviceAMethod() {
   a=getA(); // EG: 1 
   b=getB(); // EG: 2
   calc.divide(1, 2); // effective call
}
如果在Calc类中交换a和b,仍将使用值1、2调用它。然后测试以下各项:

verify(calcMock).divide(1, 2);

测试ServiceMethod,其中假设签名为divide,即第一个参数是被除数,第二个参数是除数

现在,
divide
的签名被更改,即第一个参数现在是除数,第二个参数是被除数。但是
serviceMethod
的测试仍然通过

calc的单元测试肯定会捕捉到这一点,但如果在这种情况下,
divide
的每个客户机的一些测试也失败了,这将是很方便的,因为
divide
的签名更改肯定会破坏客户机,并要求更改客户机

当您更改一个方法解释其参数的方式时,您肯定需要更改该方法的客户端。mock
divide
的测试无法检测到此类更改


使用real
Calc
ServiceMethod
集成测试将检测到此类更改,并将中断。这将提醒您,应该更改
ServiceMethod
,以便它以另一个顺序传递参数。

测试ServiceMethod,在编写时假设签名为
divide
,即第一个参数是被除数,第二个参数是除数

现在,
divide
的签名被更改,即第一个参数现在是除数,第二个参数是被除数。但是
serviceMethod
的测试仍然通过

calc的单元测试肯定会捕捉到这一点,但如果在这种情况下,
divide
的每个客户机的一些测试也失败了,这将是很方便的,因为
divide
的签名更改肯定会破坏客户机,并要求更改客户机

当您更改一个方法解释其参数的方式时,您肯定需要更改该方法的客户端。mock
divide
的测试无法检测到此类更改


使用real
Calc
ServiceMethod
集成测试将检测到此类更改,并将中断。这将提醒您,应该更改
serviceMethod
,以便它以其他顺序传递参数。

好的,我认为这是我的解决方案,它比全面集成测试更好

我已将参数重构为pojo

public class OperationRequest {
    private int firstOperand;
    private int secondOperand;
    //equals and hashCode, important!
}
那么计算除法就变成了

calc.divide(OperationRequest request);
以及断言

verify(calcMock).divide(new OperationRequest(1,2));

如果您交换操作数,现在就失败了。好的,这是我的解决方案,我认为它比完整的集成测试更好

我已将参数重构为pojo

public class OperationRequest {
    private int firstOperand;
    private int secondOperand;
    //equals and hashCode, important!
}
那么计算除法就变成了

calc.divide(OperationRequest request);
以及断言

verify(calcMock).divide(new OperationRequest(1,2));

如果您交换操作数

参数捕获器,那么现在就失败了。实际上,我不确定您在这里要做什么。方法签名对于verify方法并不重要,只有方法调用才重要。它会检查您是否调用了calc.divide(a,b)。如果您将serviceMethod更改为calc.divide(b,a),则不应更改pass@RomanKonoval不,a和b是不同的目标捕获者事实上我不确定你想在这里做什么。方法签名对于verify方法并不重要,只有方法调用才重要。它会检查您是否调用了calc.divide(a,b)。如果您将serviceMethod更改为calc.divide(b,a),则不应更改pass@RomanKonoval不,a和b是不同的你是对的,但是如何正确地测试它?mocktio即使在测试中假设a、b中有值,也必须交换它们。最好的选择可能是为方法结果编写测试。e、 g:除法(6,2)应始终返回3。如果有人更改了类签名(开关a和b),它将不会通过。@Amongalen嗯,是的,但对于api Calc的用户,我将注入一个模拟,因此参数的顺序无关紧要pass@AmongalenOP试图解决这个问题。测试
serviceMethod
,其中假设签名为
divide
(第一个参数为被除数,第二个参数为除数)。现在,
divide
的签名已更改(第一个参数是除数,第二个是被除数),但
serviceMethod
的测试仍然通过。计算的单元测试将定义