mocktio проверить порядок параметров - PullRequest
0 голосов
/ 11 октября 2018

Я искал это некоторое время без ответа.

Допустим, у меня есть класс Сервис , который использует Calc зависимость

Calc имеет метод деления

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);
}

это проходит, но если я перехожу к Calc.divide и меняю подпись на

public void divide(int b,int a)

, она все равно проходит

как это сделатья проверяю, что правильные аргументы передаются в правильном порядке?

Редактировать: Не обязательно с Mockito, как мне сделать этот тест более устойчивым?

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Тесты для serviceMethod, где написано с предположением о сигнатуре divide, а именно о том, что первый аргумент является дивидендом, а второй аргумент является делителем.

Теперь сигнатура divide изменяется, а именнопервый аргумент теперь является делителем, а второй аргумент - дивидендом.Но тест для serviceAMethod по-прежнему проходит.

Юнит-тест для calc определенно захватит это, но было бы удобно, если бы в этом случае также не получался какой-то тест для каждого клиента divide, так как такое изменение подписииз divide определенно ломает клиентов и требует изменения клиентов.

Когда вы изменяете, как метод интерпретирует свои параметры, что определенно потребует изменения клиентов метода.Тесты, которые имитируют divide, не могут обнаружить такое изменение.

Интеграционный тест для serviceAMethod, в котором используется действительное Calc, обнаружит такое изменение и сломается.Это напомнит вам, что serviceAMethod следует изменить, чтобы передать параметры в другом порядке.

0 голосов
/ 12 октября 2018

хорошо, вот мое решение, которое, я думаю, лучше, чем полномасштабный интеграционный тест

Я изменил аргументы, чтобы они были pojo

public class OperationRequest {
    private int firstOperand;
    private int secondOperand;
    //equals and hashCode, important!
}

, тогда Calc.divide становится

calc.divide(OperationRequest request);

и утверждение

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

теперь это не удастся, если вы поменяете местами операнды

0 голосов
/ 11 октября 2018

Это потому, что значения, переданные в Calc.divide, остаются прежними.Mockito проверяет переданные значения, а не имя аргумента.Таким образом, изменение порядка параметров в классе Calc не повлияет на тест, если вы не измените вызов, выполненный в методе serviceAMethod, чтобы отразить это изменение.

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
}

Если вы поменяете местами a и b в классе Calc, он все равно будет вызываться со значениями1, 2. И вы проверяете следующее:

verify(calcMock).divide(1, 2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...