2013-05-02 10 views
2

Предполагая, что в модульном тесте мне нужен объект, все из 50 полей которого настроены с некоторыми значениями. Я не хочу вручную настраивать все эти поля, так как это требует времени и досады ...Сериализуйте объект для модульного тестирования

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

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

Затем я поместил этот файл в папку тестовых ресурсов, и в модульных тестах будет просто десериализовать его из этого места.

Звучит выполнимо .. и разумно? Есть ли другая идея или как вы это сделаете?

UPD: Я согласен, что сериализация не подходит в этом случае. 1) Сохраненный объект не читается человеком. 2) Версия может измениться (очень маловероятна) и не является большой проблемой, я полагаю ... Итак, может быть, есть ли какие-либо читаемые простые для сериализации форматы?

В идеале я хотел бы иметь на самом деле исходный код для генерации. Поскольку это java bean, все геттеры/сеттеры есть. Почему бы не сгенерировать набор вызовов сеттеров по данному объекту во время выполнения?

+3

И после создания 50 из этих файлов кто-то меняет класс. – Kai

ответ

0

Это будет работать, но это Насти с заглавной Н.

Проблема в том, когда кто-то читает код, это трудно понять только то, что используются значения - данный код читается много раз, чем написано, которое вы должны оптимизировать для чтения.

Другие вещи, которые приходят на ум:

  • тестирование все о границах, если вы используете только один набор значений, как может ваш тест попали эти границы?
  • делает каждый тест нужно все 50 значений, так там может быть что-то еще не так с вашим дизайном

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

+1

Да, это была идея - установить необходимые значения по умолчанию и переопределить «границы».также объекты могут быть одинаковыми, но «границы» могут быть вне этого объекта, и это также должно быть проверено - как система реагирует на один и тот же объект, но в разных средах. проблема заключается в этом заводском методе. Кто это должен написать? Я не хочу. Я раздражаю, и более того, я не уверен, какие значения являются значениями по умолчанию. Если сериализация является baaaad - можно ли создать этот заводский метод, предоставив экземпляр объекта как вход? Вы правы, этот код должен быть читабельным ... – javagirl

+0

Часть развития заключается в том, что иногда вам приходится выполнять утомительные задачи, но ясность кода перевешивает вашу временную скуку - в этом случае человек, записывающий тест, должен написать метод. Некоторые из насмешливых API возвратят значения по умолчанию в ответ на вызовы методов, которые вы не объявили, но это просто звучит как сложность для меня - простейшая вещь, которая работает, заключается в инициализации объекта в тестовом примере для всех, чтобы видеть. –

+1

, но это глупо .. объект содержит много полей, и я даже не знаю, что является допустимыми значениями для некоторых полей .. Мне просто нужен типичный объект с заданными значениями. Я не верю, что такого инструмента для генерации java-кода по данному экземпляру java bean не существует, поскольку все определители/получатели определены. Похоже, мой вопрос похож на http://stackoverflow.com/questions/3251190/how-do-i-eneration-the-source-code-to-create-an-object-im-debugging – javagirl

0

Почему бы вам не создать файл .properties с именем свойства точно так же, как ваш атрибут в классе. Прочтите этот ключ/значения файла свойств и определители вызовов, используя ключ путем отражения. Вот основной пример кода для этого:

package consoleouput; 

import java.io.FileInputStream; import java.lang.reflect.Method; import java.util.Properties; import java.util.Set; 

class Config { private String a; private String b; 

    public String getA() {  return a; } 

    public void setA(String a) {  this.a = a;  } 

    public String getB() {  return b; } 

    public void setB(String b) {  this.b = b;  } 

} 

public class App { public static void main(String[] args) {  Properties prop = new Properties();   Config config = new Config();  try {   // load a properties file   prop.load(new FileInputStream("config.properties"));   Set<Object> propKeys = prop.keySet();   for (Object key : propKeys) { 
       String keyString = (String) key; 
       String keyValue = prop.getProperty((String) key); 
       // Make sure you use the key value starting with upper case in 
       // properties file 
       String keySetterMethod = "set" + keyString; 
       System.out.println("Setter method name :" + keySetterMethod); 
       // Use reflection to call the method 
       Method method = config.getClass().getMethod(keySetterMethod, 
         String.class); 

       method.invoke(config, keyValue);   }   System.out.println("Value of a : " + config.getA());   System.out.println("Value of b : " + config.getB());  } catch (Exception e) {    e.printStackTrace();  } } } 

Здесь содержание образца cofig.properties:

A = тест B = остальные

ПРИМЕЧАНИЕ: Вы можете использовать CSV для генерации разные объекты, использующие один и тот же подход.

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