Тестирование является одной из наиболее важных частей разработки программного обеспечения. Хорошо организованное тестирование помогает поддерживать код приложения в хорошем состоянии, в рабочем состоянии. Существует множество различных типов тестов и методологий. В этой статье я хочу сделать введение в модульное тестирование приложений на основе Spring MVC. Не надейтесь прочитать все о Spring MVC-тестировании здесь, потому что это только первая статья о модульном тестировании.
Поговорим о модульном тестировании без какого-либо приложения, которое я собираюсь проверить — обман. Я буду использовать одно из своих приложений из предыдущего поста, чтобы избежать сплетен. я
Рекомендую сделать краткий обзор приложения, прежде чем продолжить чтение текущего поста. Основная цель этого руководства — показать, как настроить модульные тесты для приложения Spring MVC с помощью аннотации.
Препараты
Первое, что мы всегда должны делать перед началом любой разработки, — это добавление новых зависимостей в файл pom.xml Maven. Этот случай не является исключением.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
... < dependency > < groupid >org.springframework</ groupid > < artifactid >spring-test</ artifactid > < version >${spring.version}</ version > < scope >test</ scope > </ dependency > < dependency > < groupid >org.springframework</ groupid > < artifactid >spring-test-mvc</ artifactid > < version >1.0.0.M1</ version > < scope >test</ scope > </ dependency > ... < repositories > < repository > < id >spring-maven-milestone</ id > < name >Spring Maven Milestone Repository</ name > </ repository > </ repositories > ... |
Я добавил две новые зависимости:
- # 1 весенний тест
- № 2 Spring-Test-MVC
Первый — для поддержки тестирования приложений Spring с помощью таких инструментов, как JUnit и TestNG. Этот артефакт, как правило, всегда определяется областью «тестирования» для среды интеграционного тестирования и заглушек модульного тестирования. Второй — для тестирования Spring MVC серверного и клиентского кода RestTemplate. Обратите внимание, что я добавил новый репозиторий. Я сделал это, потому что spring-test-mvc все еще не находится в официальном репозитории maven.
Контроллер для юнит-тестов
В этом посте я собираюсь написать два модульных теста для самого простого контроллера. Вот код контроллера:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
@Controller public class LinkController { @RequestMapping (value= "/" ) public ModelAndView mainPage() { return new ModelAndView( "home" ); } @RequestMapping (value= "/index" ) public ModelAndView indexPage() { return new ModelAndView( "home" ); } } |
Итак, как вы можете видеть, методы в контроллере тривиальны, они просто возвращают JSP. Тестирование контроллера подразумевает проверку статуса запроса (в случае успеха код должен быть 200) и проверку имени представления.
Написание юнит-тестов для Spring MVC
Вот цитата Петри Кайнулайнена :
Сердцем Spring-test-mvc является класс MockMvc, который можно использовать для написания тестов для любого приложения, реализованного с помощью Spring MVC. Наша цель — создать новый объект MockMvc, используя реализации интерфейса MockMvcBuilder. Класс MockMvcBuilders имеет четыре статических метода, которые мы можем использовать для получения реализации интерфейса MockMvcBuilder. Эти методы описаны ниже:
- Метод ContextMockMvcBuilder annotationConfigSetup (Class… configClasses) должен использоваться, когда мы используем конфигурацию Java для настройки контекста приложения нашего приложения.
- ContextMockMvcBuilder xmlConfigSetup (String… configLocations) должен использоваться, когда контекст приложения нашего приложения настраивается с использованием файлов конфигурации XML.
- StandaloneMockMvcBuilder standaloneSetup (Object… controllers) должен использоваться, когда мы хотим сконфигурировать протестированный контроллер и необходимые компоненты MVC вручную.
- InitializedContextMockMvcBuilder webApplicationContextSetup (контекст WebApplicationContext) должен использоваться, когда мы уже создали полностью инициализированный объект WebApplicationContext.
Я собираюсь использовать контекст веб-приложения, для этого мне нужно создать класс с конфигурациями:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
package com.sprhib.init; import org.springframework.context.annotation.*; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.view.*; @Configuration @ComponentScan ( "com.sprhib" ) @EnableWebMvc public class BaseTestConfig { @Bean public UrlBasedViewResolver setupViewResolver() { UrlBasedViewResolver resolver = new UrlBasedViewResolver(); resolver.setPrefix( "/WEB-INF/pages/" ); resolver.setSuffix( ".jsp" ); resolver.setViewClass(JstlView. class ); return resolver; } } |
И наконец класс с тестами:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
package com.sprhib.test; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import com.sprhib.init.BaseTestConfig; @RunWith (SpringJUnit4ClassRunner. class ) @WebAppConfiguration @ContextConfiguration (classes=BaseTestConfig. class ) public class LinkControllerTest { @Autowired private WebApplicationContext wac; private MockMvc mockMvc; @Before public void init() { mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); } @Test public void testHomePage() throws Exception { mockMvc.perform(get( "/" )) .andExpect(status().isOk()) .andExpect(view().name( "home" )); } @Test public void testIndexPage() throws Exception { mockMvc.perform(get( "/index.html" )) .andExpect(status().isOk()) .andExpect(view().name( "home" )); } } |
Обратите внимание, что я использовал статический импорт, они обеспечивают использование таких методов, как get (), status () и т. Д. @WebAppConfiguration — это аннотация уровня класса, которая используется для объявления того, что ApplicationContext, загружаемый для теста интеграции, должен быть WebApplicationContext. Посмотрите на структуру проекта после того, как я добавил все тестируемые материалы:
Проверьте проект на GitHub. Я надеюсь, что все ясно. Spring test MVC project — хороший инструмент для тестирования соответствующих приложений. Есть только один недостаток отсутствия документации и учебных пособий. В следующих уроках я собираюсь развить эту тему.