2013-08-07 3 views
1

Say в основном коде, у вас есть что-то вроде этого:Резервные методы через несколько тестов блок/классов

MyClass.java

public class MyClass { 
    public List<Obj1> create(List<ObjA> list) { 
     return (new MyClassCreator()).create(list); 
    } 
    // Similar methods for other CRUD operations 
} 

MyClassCreator.java

public class MyClassCreator { 
    Obj1Maker obj1Maker = new Obj1Maker(); 

    public List<Obj1> create(List<ObjA> list) { 
     List<Obj1> converted = new List<Obj1>(); 
     for(ObjA objA : list) 
      converted.add(obj1Maker.convert(objA)); 
     return converted; 
    } 
} 

Obj1Maker.java

public class Obj1Maker { 
    public Obj1 convert(ObjA objA) { 
     Obj1 obj1 = new Obj1(); 
     obj1.setProp(formatObjAProperty(objA)); 
     return obj1; 
    } 

    private String formatObjAProperty(ObjA objA) { 
     // get objA prop and do some manipulation on it 
    } 
} 

Предположим, что тестовый модуль для Obj1Maker уже сделано, и включает в себя метод makeObjAMock(), который издевается комплекс объектов А.

Мои вопросы:

  1. для модульного тестирования MyClassCreator, как бы я тест create(List<ObjA> list)? Весь метод действительно делегирует преобразование с ObjA в Obj1 и запускает его в цикле. Само преобразование уже протестировано. Если бы я должен был создать список ObjA и протестировал каждый объект в списке Obj1, я вернусь, мне нужно было бы скопировать в модульный тест MyClassCreator. Очевидно, что это будет повторяющийся код, так что использует verify() для обеспечения того, чтобы создать (список списка)?

  2. Для модульных испытаний MyClass, опять же, его метод create(List<ObjA>) просто делегирует операцию MyClassCreator. Действительно ли мне нужно протестировать это с помощью полных тестовых примеров, или я должен просто проверить, вызван ли метод MyClassCreator create?

  3. В модульном тесте для Obj1Maker я проверил, что свойства Obj1 и ObjA соответствуют друг другу, выполняя assertEquals(obj1.getProp(), formatObjAProperty(objA)). Однако это означает, что мне пришлось дублировать код для частного метода formatObjAProperty из класса Obj1Maker в его модульный тест. Как я могу предотвратить повторение кода в этом случае? Я не хочу, чтобы этот метод был общедоступным/защищенным, чтобы я мог использовать его в модульном тесте. В этом случае допустимо повторение?

Спасибо, извините за длительные вопросы.

ответ

0

Мое мнение здесь. Выбор того, какие методы тестирования - это трудная задача.

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

Я бы сказал, написав новый код, чтобы проверить, что два объекта имеют одинаковые данные в двух форматах, было бы хорошей идеей. Вероятно, нет причин дублировать код из частного метода, а копирование кода - плохая идея. Помните, что вы проверяете требования. Таким образом, если исходная строка говорит «6/30/13» и переформатировать один сказал «30 июня 2013», я бы просто жесткий код проверки:

assertEquals("Wrong answer", "June 30th 2013", obj.getProp()); 

Добавить еще немного утверждает за крайние случаи и ошибки.(В моем примере используйте «2/30/13» и «2/29/12» и «12/1/14», чтобы проверить незаконную дату, високосный год и, возможно, «1-й», а не «1-й».)

В тесте на метод создания я бы, скорее всего, просто попробовал бы легкую ошибку и удостоверился, что возвращаемый массив имел такое же число, что и тот, в котором он был. Тот, с которым я прошел, будет иметь два одинаковых элемента, а некоторые разные. Я просто проверю, что идентичные возвращаются идентичными, а разные - не идентичными. Зачем? Потому что мы уже знаем, что работает форматир.

Я бы не тестировал конструктор, но был бы уверен, что какой-то тест выполнил код в нем. Хорошо убедиться, что большая часть кода на самом деле работает в тесте, чтобы обнаруживать немые ошибки, например, нулевые указатели, которые вы пропустили.

Точка баланса - это то, что вы ищете.

Достаточно испытаний, тестирования достаточно разных вещей, чтобы чувствовать себя хорошо в работе кода.

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

Не так много тестов, которые тесты выполняются навсегда, и все разработчики (включая вас) будут откладывать запуск, потому что они не хотят ждать или терять ход мысли во время их запуска.

Баланс!

Смежные вопросы