使用springboot对各个层的代码进行测试

简介: 因为近段时间在一个系统,后端代码使用的技术栈是spring boot (版本1.5.12.RELEASE)、alibaba-spring-boot (版本1.5.12.0-SNAPSHOT)、pandora-boot (版本2018-05-release),写好各种mapper、service、c.

因为近段时间在一个系统,后端代码使用的技术栈是spring boot (版本1.5.12.RELEASE)、alibaba-spring-boot (版本1.5.12.0-SNAPSHOT)、pandora-boot (版本2018-05-release),写好各种mapper、service、controller层的代码之后免不了要进行测试,最高效的测试方法还是写单元测试,如果自己在本地把服务起来,页面上点点点,那是极其low极力不推荐的!

下面就介绍一下各个层的测试基类的写法:

pom依赖如下:

<!--test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <version>1.3.2</version>
        </dependency>

        <dependency>
            <groupId>com.taobao.pandora</groupId>
            <artifactId>pandora-boot-test</artifactId>
            <scope>test</scope>
        </dependency>

一、mapper层的测试

测试基类如下:

@RunWith(SpringRunner.class)
@ActiveProfiles("test")
@MybatisTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Rollback(false)
public class BaseMapperTest {
}

说明:
1、使用@MybatisTest,如果不加注解@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE),那么mybatis使用的是内存数据库,并不是真实的tddl的数据库,会报表不存在的错,官方文档在此:http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-test-autoconfigure/
Using a real database
The In-memory embedded databases generally work well for tests since they are fast and don’t require any developer installation. However if you prefer to run tests against a real database, you can use the @AutoConfigureTestDatabase as follow:
2、@Rollback(false) 单测完成默认会将数据回滚,如果不想回滚,想保留在数据库中,要加(false)。

二、service层的测试

测试基类如下:

@RunWith(PandoraBootRunner.class)
@DelegateTo(SpringJUnit4ClassRunner.class)
@ActiveProfiles("test")
@MybatisTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@SpringBootTest(classes = TestServiceConfiguration.class)
public class BaseServiceTest {
}

说明:在做service层的测试的时候,还是遇到一些问题,网上各种搜资料,很多例子在进行service层的测试时将dao层进行了mock的办法,但我并不想mock,经过一顿勇猛猜测,最后终于跑通了。比起mapper层的测试,多了这么几个注解:
@RunWith(PandoraBootRunner.class)
@DelegateTo(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = TestConfiguration.class)
参考资料: http://gitlab.alibaba-inc.com/middleware-container/pandora-boot/wikis/test

为什么要加最后一个注解呢,这个要看自己的项目来定,一开始写的是@SpringBootTest(classes = Application.class),发现运行测试的时候总有一些service无法注入,报错: No qualifying bean of type 'xxx' available。
后来按照网上的解决办法,自己写了个TestConfiguration,代码如下:

@ComponentScan(basePackages={
        "com.alibaba.ais.feds.mapper",
        "com.alibaba.ais.feds.service"})
@SpringBootApplication
public class TestServiceConfiguration {
    public  static  void main(String[] args){
        SpringApplication.run(TestServiceConfiguration.class, args);
    }
}

具体的原因等空了还需要再推敲一下,遇到问题不能仅仅靠猜。

三、controller层的测试:

基类如下:

@RunWith(PandoraBootRunner.class)
@DelegateTo(SpringRunner.class)
@ActiveProfiles("test")
public class BaseAjaxControllerTest {
}

一般在进程controller层测试的时候,会将service层进行mock,我介绍2种写法,分别是mock的方法和不mock的方法:
1、不mock的方法:

@WebMvcTest(value = DrillScenarioAjaxController.class, secure = false)
public class DrillScenarioAjaxControllerTest extends BaseAjaxControllerTest{

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ScenarioService scenarioService;


    @Test
    public void testExecScenario(){
        RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/scenario/42/exec?employeeId=57524")
                .accept(MediaType.APPLICATION_JSON_UTF8_VALUE);
        try {
            MvcResult result = mockMvc.perform(requestBuilder).andReturn();
            MockHttpServletResponse response = result.getResponse();
            Assert.assertThat(response.getStatus(), equalTo(200));
            System.out.println(response.getContentAsString());
        }
        catch (Exception e){
            System.out.println(e.fillInStackTrace());
        }

    }

    @Configuration
    @EnableWebMvc
    @Import({TestControllerConfiguration.class})
    static class Config {
    }
}
@ComponentScan(basePackages={
        "com.alibaba.ais.feds.mapper",
        "com.alibaba.ais.feds.service",
        "com.alibaba.ais.feds.controller"})
@SpringBootApplication
public class TestControllerConfiguration {
    public  static  void main(String[] args){
        SpringApplication.run(TestControllerConfiguration.class, args);
    }
}

2、mock的方法:

@WebMvcTest(value = ApplicationAjaxController.class, secure = false)
public class ApplicationAjaxControllerTest extends BaseAjaxControllerTest{
    @Autowired
    private MockMvc mockMvc;

    @MockBean
    //@Autowired
    private ApplicationApi applicationApi;

    @Autowired
    private TokenService tokenService;

    @Test
    public void test() throws Exception {
        String mockResult = "{\"object\":{\"applications\":[{\"name\":\"app-center\",\"id\":112608}]},\"successful\":true}";

        Mockito.when(
                applicationApi.queryApps(Mockito.anyMap())).thenReturn(JSON.parseObject(mockResult));
        RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/queryAppsByNameFromAone?query=app-center")
                .accept(MediaType.APPLICATION_JSON_UTF8_VALUE);
        MvcResult result = mockMvc.perform(requestBuilder).andReturn();
        MockHttpServletResponse response = result.getResponse();
        Assert.assertThat(response.getStatus(), equalTo(200));
        Assert.assertThat(response.getContentAsString(),equalTo(mockResult));
    }
    
    @Configuration
    @EnableWebMvc
    @Import({TestControllerConfiguration.class})
    static class Config {
    }
}

注意:
一开始跑controller层测试的时候,response 总是404,后来发现一定要加上 @EnableWebMvc注解,问题解决。

好了,测试跑通,现在感觉想怎么测,就怎么测。

目录
相关文章
|
1月前
|
数据采集 机器学习/深度学习 大数据
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
这篇文章详细介绍了C3D架构在行为检测领域的应用,包括训练和测试步骤,使用UCF101数据集进行演示。
40 1
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
|
24天前
|
Java 测试技术 开发者
必学!Spring Boot 单元测试、Mock 与 TestContainer 的高效使用技巧
【10月更文挑战第18天】 在现代软件开发中,单元测试是保证代码质量的重要手段。Spring Boot提供了强大的测试支持,使得编写和运行测试变得更加简单和高效。本文将深入探讨Spring Boot的单元测试、Mock技术以及TestContainer的高效使用技巧,帮助开发者提升测试效率和代码质量。
130 2
|
1月前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
14天前
|
缓存 监控 Java
|
14天前
|
缓存 监控 Java
|
1月前
|
安全 Java 数据库
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
这篇文章是关于Apache Shiro权限管理框架的详细学习指南,涵盖了Shiro的基本概念、认证与授权流程,并通过Spring Boot测试模块演示了Shiro在单应用环境下的使用,包括与IniRealm、JdbcRealm的集成以及自定义Realm的实现。
42 3
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
|
1月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
105 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
1月前
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
404 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
1月前
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
|
1月前
|
消息中间件 Java 大数据
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
65 2