Модульное тестирование контроллеров с аннотациями - PullRequest
2 голосов
/ 30 сентября 2010

Я пытаюсь написать несколько модульных тестов для моих контроллеров в веб-приложении Spring MVC. У меня уже есть достаточно полный набор модульных тестов для модели предметной области, но для полноты картины я тоже хочу протестировать контроллеры.

Проблема, с которой я сталкиваюсь, состоит в том, чтобы попытаться проверить их без загрузки контекста Spring. Я думал, что смогу обойти это с помощью насмешек, но метод в контроллере имеет аннотацию @Transactional, которая пытается открыть транзакцию (и завершается неудачно с NullPointerException, потому что не загружен контекст Spring).

Пример кода:

public class UsersController {

  @Autowired private UserManager userManager;

  @Transactional
  @RequestMapping(method = RequestMethod.POST)
  public ModelAndView create(User user) {

    userManager.save(user);

    ModalAndView mav = new ModelAndView();    
    mav.addObject("user", user);
    mav.setViewName("users/view");
    return mav;
  }

}

По сути, я хочу протестировать поведение без загрузки контекста и фактического сохранения пользователя.

У кого-нибудь есть идеи, как мне этого добиться?

Приветствия

Caps

Ответы [ 2 ]

3 голосов
/ 30 сентября 2010

Я бы сказал, что насмешка - это путь сюда. Аннотация @Transactional не будет иметь никакого эффекта, если не будет загружен контекст Spring и указано, что нужно настраивать транзакции на основе примечаний.

Убедитесь, что вы не указываете JUnit запустить тест в контексте весны, указав что-то вроде:

@ContextConfiguration(locations = "classpath:spring/ITestAssembly.xml")
@RunWith(SpringJUnit4ClassRunner.class)

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

1 голос
/ 30 сентября 2010

NullPointerException происходит не из-за Transactional, а потому, что ничего не вводится как UserManager.У вас есть два варианта:

  • запустить с бегунком для испытания пружин
  • смоделировать userManager и установить его.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...