SpringBoot测试(Junit单元测试、MockMvc测试Http请求 )

这篇具有很好参考价值的文章主要介绍了SpringBoot测试(Junit单元测试、MockMvc测试Http请求 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java知识点总结:想看的可以从这里进入

2.13、测试

测试就是在开发过程中用来检测某一段代码的功能是否能正确执行,Spring Boot 项⽬创建时会默认单元测试框架 spring-boot-test,它Spring Test、JUnit等其他测试框架结合起来(JUnit 5、AssertJ、Hamcrest、Mockito、JSONassert、JsonPath、Spring Test和Spring Boot Test)。

在使用测试是可以直接通过启动器:spring-boot-starter-test得到测试的支持。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
    </exclusions>
</dependency>

在SpringBoot中提供了一些注解来帮助我们进行测试:

  1. @SpringBootTest:寻找一个主配置类(@SpringBootApplication),并使用它来启动Spring应用程序上下文。SpringBootTest加载完整的应用程序并注入所有可能的bean,因此需要一定时间。

    1. MOCK(默认值):加载web ApplicationContext并提供一个模拟web环境,嵌入式服务器不会启动,可以与@AutoConfigureMockMvc或@AutoConfigureWebTestClient一起使用,用于基于模拟的web应用程序测试。
    2. RANDOM_PORT:加载一个WebServerApplicationContext并提供一个真实的web环境。嵌入式服务器在一个随机端口上启动并监听。
    3. DEFINED_PORT:加载WebServerApplicationContext并提供一个真实的web环境。嵌入式服务器将启动并在一个已定义的端口(yml中)或默认端口8080上侦听。
    4. NONE:通过使用SpringApplication加载ApplicationContext,但不提供任何web环境(模拟或其他)。
  2. @Test:用在方法上进行测试实际的业务逻辑

  3. @AutoConfigureMockMvc:和SpringBootTest 一起使用,可以自动配置MockMvc,测试Controller

2.12.1、 Junit单元测试
1、测试

需要添加用于单元测试的启动器,该启动器会自动导入 junit 的相关依赖:

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

使用测试 可以对项目中的方法进行测试,看它的执行是否能达到我们的预期效果,对相应的类创建对应的测试类,在方法上添加注解 @Test,就能使测试方法如同 main方法一样可以直接运行,这样就能观察到该方法最终执行的效果。

我们可以使用 IDEA 对某个类直接生成单元测试类。

  • 在相应的类中 按 ctrl+shitf+T快捷键

  • 选择需要测试的方法,并生成测试的类(⽣成了单元测试的框架类,具体的业务代码要⾃⼰填充)

  • 选择一个select 方法生成测试类

  • 添加注解SpringBootTest注解(可以加载被管理的Bean),并编写业务逻辑

2、常用注解
  1. @SpringBootTest:是一个组合注解,内部含有 JUnit5中使用 的运行器注解 @ExtendWith

  2. @Test:用在方法上,表示该方法是一个测试用方法,使可以运行

  3. @DisplayName(“名称”):给测试类设置一个名称

  4. 增强处理

    1. @BeforeEach:前置方法,每个测试方法执行前都会执行
    2. @AfterEach:后置方法,在每个测试方法执行后都会执行
    3. @BeforeAll:表示在所有测试方法之前执行
    4. @AfterAll:表示在所有测试方法之后执行
    @SpringBootTest
    @Slf4j
    class JunitTest {
        @Test
        public void test() {
            log.info("测试1");
        }
        @Test
        public void test2() {
            log.info("测试2");
        }
        @Test
        public void test3(){
            log.info("测试3");
        }
    
        @BeforeEach
        public void BeforeEach(){
            log.info("在每个方法执行前执行");
        }
        @AfterEach
        public void afterEach(){
            log.info("在每个方法执行后执行");
        }
        @BeforeAll
        static void beforeAll(){
            log.info("在所有测试方法执行前执行");
        }
        @AfterAll
        static void afterAll(){
            log.info("在所有测试方法执行后执行");
        }
    }
    
  5. @Disabled:用在测试方法前,单独执行该方法时可以运行,但是如果点击测试类运行测试类内所有方法时,则加上此注解的方法不会运行

    springboot 测试代码,springboot,junit,单元测试,spring boot

  6. @Timeout(value =超时时间,unit = 超时时间单位):设置方法的执行时间,如果超时会出现异常。

    TimeUnit.DAYS:代表二十四小时的时间单位

    TimeUnit.HOURS:代表六十分钟的时间单位

    TimeUnit.MINUTES:代表六十秒的时间单位。

    TimeUnit.SECONDS:时间单位代表一秒

    TimeUnit.MILLISECONDS:表示千分之一秒的时间单位。

    TimeUnit.MICROSECONDS:表示千分之一毫秒的时间单位

    TimeUnit.NANOSECONDS:表示千分之一微秒的时间单位

  7. @RepeatedTest(次数) :该方法每次运行都会执行指定次数。需要去掉@Test注解

    springboot 测试代码,springboot,junit,单元测试,spring boot

    springboot 测试代码,springboot,junit,单元测试,spring boot

3、断言

其中类Assertions是支持在测试中断言条件的实用方法的集合,除非另有说明,否则失败的断言将抛出org.opentest4j.AssertionFailedError或其子类。所有 JUnit断言 都是 org.junit.jupiter.Assertions 类中的静态方法

1、assertTrue(boolean condition):判断给定的boolean是否为true
2、assertFalse(boolean condition):判断给定的boolean是否为false
3、assertNull(Object actual):判断 Object 是否为null
4、assertNotNull(Object actual):判断 Object 不是null
5、assertEquals(o1,o2):判断两个对象是否相等
6、assertArrayEquals([][]):判断连个数组是否相等
2.12.2、MockMvc

Junit 无法测试Controller中的方法,因为它是一种网络请求,所有我们可以使用 MockMvc 对Controller方法 进行测试

MockMvc是由spring-test包提供,MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,使请求的验证变得更加方便。

这里有两个注解:

  • @WebMvcTest:使用此注解会禁用完全自动配置,仅仅配置MVC相关配置

  • @AutoConfigureMockMvc:自动配置MockMvc

使用@AutoConfigureMockMvc+@SpringBootTest进行测试:

  • 正常创建Controller

    @Controller
    @RequestMapping("/testMockMvc")
    public class UserinfoController {
        @Resource
        private UserinfoService userinfoService;
    
        @GetMapping("/getUserinfo")
        @ResponseBody
        public Userinfo userinfo(long id){
            return userinfoService.getById(id);
        }
    
        @GetMapping("/hello")
        public String hello(String name , Model model){
            model.addAttribute("user", name+"欢迎欢迎");
            return "hello";
        }
    }
    
  • 编写测试类

    @SpringBootTest
    @AutoConfigureMockMvc
    public class UserControllerTest {
       
        @Autowired
        private MockMvc mockMvc;
        /*
         * 1、mockMvc.perform执行一个请求。
         * 			MockMvcRequestBuilders.get("XXX") get提交访问controller的一个接口。
         *    		MockMvcRequestBuilders.post("XXX") post提交访问controller的一个接口。
         * 			.param  传递的参数
         * 			.accept(MediaType.TEXT_HTML_VALUE))接受的响应结果的文档类型
         *    		.contentType   请求数据的文档类型
         *			.content()   可以传递JSON数据
         * 2、.andExpect  添加执行完成后的断言。
         * 3、.andDo  添加一个结果处理器,表示要对结果做点什么事情
         *   比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。
         * 7、.andReturn表示执行完成后返回相应的结果。
         */
        @Test
        public void getUserinfo() throws Exception {
            MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/testMockMvc/getUserinfo")
                            .param("id","1")
                            .contentType(MediaType.APPLICATION_JSON)
                    ).andDo(print())
                    .andExpect(status().isOk())
                    .andReturn();
    
        }
        @Test
        public void hello() throws Exception {
            MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/testMockMvc/hello")
                            .param("name","yu")
                    ).andDo(print())
                    .andExpect(status().isOk())
                    .andReturn();
    
        }
    }
    
  • 测试页面跳转

  • 测试返回数据文章来源地址https://www.toymoban.com/news/detail-735706.html

到了这里,关于SpringBoot测试(Junit单元测试、MockMvc测试Http请求 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Cloud中Controller单元测试 Junit5 & MockMvc

    在Spring Cloud中进行Controller的单元测试,使用Junit5和Mock。 Controller: 方式一:使用@SpringBootTest + @AutoConfigureMockMvc 方式二:使用@WebMvcTest + @ImportAutoConfiguration(RefreshAutoConfiguration.class) 解决 No Scope registered for scope name \\\'refresh\\\' 异常 注入Mockmvc方式有两种 方式一:(@AutoConfigureMockMvc / @

    2024年02月16日
    浏览(38)
  • SpringBoot 集成Junit单元测试

    学习文章: https://www.cnblogs.com/ysocean/p/6889906.html 开发工具: IDEA 2022.1.4 目录 目录 1. 概述  2. 实现步骤         2.1 maven导入依赖          2.2 随意代码演示(不推荐)         2.3 规范代码演示(推荐) 3. Junit相关其他注解 4. 注意事项 5. 结语         接触到Junit,应该是看

    2024年02月09日
    浏览(34)
  • 【SpringBoot】mockito+junit 单元测试

    CommonServiceImpl 在方法 getSourceCodeMap() 调用了 ServiceA 的方法 list(QueryBO queryBo) 。 org.mockito.exceptions.base.MockitoException: No tests found in ClientSyncServiceImplTest Is the method annotated with @Test? Is the method public? 解决方案: Test引入 org.junit.Test 不要引入 org.junit.jupiter.api.Test 例如获取当前用户 moc

    2024年02月09日
    浏览(44)
  • junit单元测试 mybatis 单独测试 springboot

    目录 省流: 正文 一、直接测(无需配置扫描和xml) 1. 场景 2. 无需配置扫描,直接在测试类注入Mapper 3. 报错 补充: 关于@RunWith 常见的报错: 1.包名不同导致报错 test目录下配置文件:application.yml中配置数据库信息。 test目录下各类:直接写测试类即可,直接调用main目录下各

    2024年02月07日
    浏览(53)
  • SpringBoot 中如何利用 Junit 实现单元测试?

    2024软件测试面试刷题,这个小程序(永久刷题),靠它快速找到工作了!(刷题APP的天花板)_软件测试刷题小程序-CSDN博客 文章浏览阅读2.5k次,点赞85次,收藏11次。你知不知道有这么一个软件测试面试的刷题小程序。里面包含了面试常问的软件测试基础题,web自动化测试、

    2024年03月11日
    浏览(43)
  • springboot Junit单元测试默认事务不提交

    因为以前总觉得Junit单元测试配置比较繁琐,代码功能大多使用main方法或者postman测试,直到最近才使用单元测试,在测试过程中遇到了事务不提交的问题,一直以为是代码问题,后来才直到单元测试 默认不提交事务 ,记录下来,防止以后再次踩坑。 如上,入库操作不会实现

    2024年02月10日
    浏览(40)
  • 13.Springboot整合junit5单元测试与生成单元测试覆盖率

    现在基本大公司都要求单元测试了,保证我们代码得质量,而我司更是要求覆盖率要达到60%以上,所以搞一下。 这里有两个方法: 1.使用maven自带得test,idea右侧maven模块执行项目下得test 2.使用cmd命令,在你的项目pom文件所在目录 ,打开cmd,执行如下: 结果如下:打开site文

    2024年02月16日
    浏览(39)
  • SpringBoot2---单元测试(Junit5)(1)

    org.junit.vintage junit-vintage-engine test org.hamcrest hamcrest-core org.springframework.boot spring-boot-starter-test test 现在版本: @SpringBootTest class Boot05WebAdminApplicationTests { @Test void contextLoads() { } } 以前: @SpringBootTest + @RunWith(SpringRunner.class) SpringBoot整合Junit以后。 编写测试方法:@Test标注(注意需要

    2024年04月29日
    浏览(43)
  • 静态方法 单元测试 springboot+mokito+junit5

    CodecUtils的方法是静态类,使用@InjectMocks不能有用,因为这个注解只能用于非静态的对象。 想要为静态方法写单元测试,可以使用Mockito.mockStatic(Class classToMock)方法,它可以返回一个MockedStatic对象,用于模拟静态方法的调用。 1.导入依赖 2.单元测试 可以参考如下地址,了解如何

    2024年04月25日
    浏览(47)
  • SpringBoot单元测试--Mockito+Junit5框架使用

    作为程序员为了提前发现代码bug,优化代码; 通常我们写完某个功能模块代码后都需要写单元测试对代码块进行测试(特别是敏捷开发中);Java项目最常用的单元测试框架即为Junit(目前最新版本为Junit5),SpringBoot本身也整合了该框架。在写单元测试时代码块中的调到第三方接口方

    2024年02月02日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包