В настоящее время я работаю над некоторыми модульными тестами для моего приложения, использующими 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 проблемой для Надежность модульных тестов? А если нет, то какой минимальный уровень надежности должен иметь модульный тест?