Статьи

Spring MVC: введение в тестирование

Тестирование является одной из наиболее важных частей разработки программного обеспечения. Хорошо организованное тестирование помогает поддерживать код приложения в хорошем состоянии, в рабочем состоянии. Существует множество различных типов тестов и методологий. В этой статье я хочу сделать введение в модульное тестирование приложений на основе 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>
            <url>http://maven.springframework.org/milestone</url>
        </repository>
    </repositories>
...

Я добавил две новые зависимости:

  1. # 1 весенний тест
  2. № 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 — хороший инструмент для тестирования соответствующих приложений. Есть только один недостаток отсутствия документации и учебных пособий. В следующих уроках я собираюсь развить эту тему.