Является ли метод EasyMock .times (x) проблемой для модульного тестирования? - PullRequest
0 голосов
/ 27 февраля 2020

В настоящее время я работаю над некоторыми модульными тестами для моего приложения, использующими JUnit и EasyMock для имитации сложных объектов, и сталкиваюсь с дилеммой . Например, я тестирую каждую функцию по следующему шаблону теста:

public static int foo(Object a){
// my function that needs to be tested

  int quantity = 0;
  if(a != null && a.getInt() != null ){
    quantity = a.getInt();
  }
  return quantity;

}

public void testFoo(){
// my unit test for the function foo
  int expectedValue = 0;
  int output = 0;

//Setting up my mocks
  Object a_mock = EasyMock.create(Object.class)
  EasyMock.expect(a_mock.getInt()).andReturn(null).times(1);
  EasyMock.expect(a_mock.getInt()).andReturn(1).times(2);

//Executing
  // Case 1: a is null
  expectedValue = 0;
  output = foo(null);
  assertEquals(expectedValue, output);

  // Case 2: a.getIn() is null
  expectedValue = 0;
  output = foo(a_mock);
  assertEquals(expectedValue, output);

  //Case 3: nominal case
  expectedValue = 1;
  output = foo(a_mock);
  assertEquals(expectedValue, output);

}

Эта структура работает довольно хорошо, но вот моя точка зрения: модульное тестирование - это процесс тестирования, который позволяет вам проверить, если каждый модуль (здесь функция) дает желаемый результат, зная ввод. Это означает, что если мне нужно изменить мою функцию foo, но без изменения ее функции, мои модульные тесты все равно должны пройти. Теоретически, если foo изменяется следующим образом:

public static int foo(Object a){

  int quantity = 0;
  if(a != null && a.getInt() != null && a.getInt() != 5){ //modification here
    quantity = a.getInt();
  }
  return quantity;

}

Тогда testFoo все равно должен пройти. Но это не , потому что .times(2) должно быть изменено в .times(3).

Итак, вот мой вопрос: является ли метод .times (x) EasyMock проблемой для Надежность модульных тестов? А если нет, то какой минимальный уровень надежности должен иметь модульный тест?

1 Ответ

0 голосов
/ 19 марта 2020

Во-первых, как указано в комментарии, вам, возможно, вообще не понадобится передавать макет для a. Возможно, использование некоторых реальных экземпляров Object достаточно просто и не окажет никаких негативных последствий на ваши тесты.

Во-вторых, если вы пришли к выводу, что издевательство необходимо, тогда вы можете избежать использования times предоставляя отдельные макеты для каждого из тестов. Вам нужно вызывать время только потому, что вы повторно используете a_mock между различными тестами.

Если пойти еще дальше, вам даже следует рассмотреть возможность разделения вашей функции testFoo на три разные функции - или прямое преобразование testFoo в параметризованный тест с тремя наборами параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...