Тестирование является одной из наиболее важных частей разработки программного обеспечения. Хорошо организованное тестирование помогает поддерживать код приложения в хорошем состоянии, в рабочем состоянии. Существует множество различных типов тестов и методологий. В этой статье я хочу сделать введение в модульное тестирование приложений на основе 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")@EnableWebMvcpublic 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 — хороший инструмент для тестирования соответствующих приложений. Есть только один недостаток отсутствия документации и учебных пособий. В следующих уроках я собираюсь развить эту тему.

