Grails: Как делают Вас модульный тест объект команды с сервисом, введенным в него

select substring(ColumnName, patindex('%[^0]%',ColumnName), 10)
5
задан Daxon 9 November 2009 в 21:27
поделиться

2 ответа

Внедрение службы выполняется с помощью Spring autowire-by-name. (С помощью Grep используйте дерево исходных текстов Grails для autowire , чтобы найти хороший фрагмент кода, который вы можете использовать для автоматического подключения контроллеров для вас в интеграционных тестах.) Это работает только в интеграционных тестах, где есть контекст приложения Spring вокруг этого есть bean-компоненты, которые можно вводить.

В модульных тестах вы должны делать это самостоятельно, поскольку вокруг ваших материалов нет Springland. Это может быть неприятно, но дает вам некоторые преимущества:

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

2) Это заставляет вас четко указывать зависимости вашего контроллера - если вы зависите от него , ваши тесты покажут это. Это делает их лучшей спецификацией для поведения вашего контроллера.

3) Вы можете имитировать только те части внешних участников, от которых зависит ваш контроллер. Это помогает сделать ваши тесты менее уязвимыми - меньше шансов, что их придется менять, когда что-то изменится.

Краткий ответ: вашему методу тестирования нужна строка cmd.userService = userService .

Это делает их лучшей спецификацией для поведения вашего контроллера.

3) Вы можете имитировать только части внешних сотрудников, от которых зависит ваш контроллер. Это помогает сделать ваши тесты менее уязвимыми - меньше шансов, что их придется менять, когда что-то изменится.

Краткий ответ: вашему методу тестирования нужна строка cmd.userService = userService .

Это делает их лучшей спецификацией для поведения вашего контроллера.

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

Краткий ответ: вашему методу тестирования нужна строка cmd.userService = userService .

11
ответ дан 18 December 2019 в 08:29
поделиться

То, что говорит Джон, уместно. Одним из примеров может быть:

def mockUsers = [new User(login:"freddy", password:"realpassword")]
mockDomain(User, mockUsers)

def userService = [getUser:{String login -> mockUsers[0]}] as UserService

def cmd = new LoginCommand (/*arguments*/)
cmd.userService = userService

Вы можете найти другие способы имитации объектов на http://groovy.codehaus.org/Groovy+Mocks

8
ответ дан 18 December 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: