Как вы используете пружинный впрыск для модульного тестирования контроллера? - PullRequest
7 голосов
/ 02 января 2012

Я хочу протестировать мой контроллер Spring MVC.

У контроллера есть сервис:

@Autowired
UserService userService

И мой сервис пользователя зависит от (autowired) моего UserDao и некоторых других сервисов, таких как mongoDbи т. д.

Теперь я хочу, чтобы бизнес-логика тестировалась в моем UserService, но, конечно, я хочу высмеивать ответы от моих UserDao и Mongodb и т. д.

Как правильно настроить мой модульный тест?

Могу ли я повторно использовать xml-файл контейнера пружины, в котором есть все мои бины и т. Д., Или создать новый? (я предполагаю, что мне нужно получить контейнер пружиныучаствую здесь)

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

Обновление

То, что я нахожу странным, это то, что для моегоSpring Controller (который не реализуется из Controller). Мне удалось получить доступ к моему личному varialbe, чтобы вручную настроить мой сервис, то есть:

@Controller
public class UserController {

   @Autowired
   UserService userService;
}

И в моем модульном тесте я мог сделать:

UserController controller = new UserController();
controller.userService = ....

Но для моего UserService, который имеет UserDao autowired, я не могу получить доступ к свойству userDao:

UserService userService = new UserServiceImpl();
userService.userDao = .... // not available

Это имеет смысл, поскольку оно является частным, но как оно работает для моего контроллера?

Ответы [ 3 ]

5 голосов
/ 02 января 2012

Spring Framework имеет очень интересные возможности для тестирования.Вы можете посмотреть справочное руководство Spring .Он может обеспечить DI даже в вашем тестовом классе JUnit.

@RunWith(SpringJUnit4ClassRunner.class)
// ApplicationContext will be loaded from "/applicationContext.xml" and "/applicationContext-test.xml"
// in the root of the classpath
@ContextConfiguration(locations={"/applicationContext.xml", "/applicationContext-test.xml"})
public class MyTest {
    // class body...
}

Вкратце, вы можете использовать свой собственный applicationContext.xml или даже определить новый для тестирования.Я лично использую другой, так как я определяю другой источник данных, выделенный для целей тестирования.

4 голосов
/ 02 января 2012

Что я нахожу странным, так это то, что для моего контроллера пружины (который не реализуется из Controller) я смог получить доступ к своему личному varialbe для ручной настройки моей службы, то есть:

Это просто: переменная не приватная.

Имеет видимость по умолчанию ("пакет приватный"). Это означает, что вы можете получить к ним доступ из всех классов одного пакета.

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

1 голос
/ 03 января 2012

Могу ли я повторно использовать xml-файл контейнера Spring, содержащий все мои bean-компоненты? и т.д. или я создаю новый? (Я предполагаю, что я должен получить весну контейнер, участвующий здесь)

Я бы не советовал создавать новый XML-файл. В конечном итоге вы скопируете много вещей, и их будет сложно поддерживать. Там будет распространение файлов конфигурации. Конфигурацию, необходимую для тестов, вы помещаете в другой XML-файл, и его даже не следует развертывать в вашей рабочей коробке. Если вы используете конфигурацию для ваших bean-компонентов, вы можете использовать механизм, предложенный @ Trein.

Для тестирования пружинного контроллера в целом, вы также можете найти эту SO Thread полезной.

Надеюсь, это поможет.

...