Как проверить анонимные занятия? - PullRequest
3 голосов
/ 18 июля 2009

Я полагаю, что вы должны быть знакомы с этой идиомой, которая является своего рода оправданием 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 ]

5 голосов
/ 18 июля 2009

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

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

1 голос
/ 18 июля 2009

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

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

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

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

0 голосов
/ 18 июля 2009

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

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

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

...