Как проверить анонимные занятия?

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

//In the "Resource Manager" class
public void process(Command cmd){
  //Initialize
  ExpensiveResource resource = new ExpensiveResource();
  //Use
  cmd.execute(resource);
  //Release / Close
  resource.close();
}

//In the Client class...
manager.process(new Command(){

  public void execute(ExpensiveResource res){
    //Do things with the resource
  }
});

Я часто использовал этот идиоматизм / паттерн, но недавно я попытался проверить его, и у меня болит голова...

Как вы можете тестировать изолированно классы ResourceManager и Client? Я обнаружил, что это так сильно их связывает, что вы не можете сделать это легко.

Идеи ценятся.

С уважением

3 ответа

Решение

Если вы не хотите превращать анонимный тип в реальный тип, который вы можете тестировать, рассмотрите возможность перемещения кода в его функции execute() в другую функцию, которую вы можете протестировать. Затем анонимный тип становится простым объектом ( http://xunitpatterns.com/Humble%20Object.html).

редактировать, но вы должны продолжить поиск способа проверить код в анонимной функции.

На типизированном языке, таком как C#, это можно сделать, используя анонимный код, вызывающий виртуальную функцию-член. Тест специализирует класс, переопределяя вызов виртуальной функции, проверяя его вызов.

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

Я думаю, что анонимные классы должны быть настолько маленькими и простыми, что тестирование структуры, включающей / использующей их, должно быть достаточно хорошим.

Если у вас есть что-то настолько сложное, большое, важное, что вы чувствуете необходимость проверить это, сделайте это полным уроком.

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

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

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

Другие вопросы по тегам