Spring Boot Mockito (二)

news2024/11/15 13:44:08

Spring Boot Mockito (二)

基于第一篇Spring Boot Mockito (一)
这篇文章主要是讲解Spring boot 与 Mockito 集成持久层接口层单元测试。

1. 引入数据库 h2及其依赖包

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

2. 增加h2的属性配置 application.properties

spring.h2.console.enabled=true

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

3. 增加Order 的属性限制

public class Order {
	//...
	// 对Order增加注解
    @NotNull
    @NotBlank
    @Size(max = 50)
    @Column(length = 50)
    private String name;
    @NotNull
    private Double price;
	//...

4. 初始化数据

@Component
@RequiredArgsConstructor
public class InitData implements CommandLineRunner {

    private final OrderRepository orderRepository;

    @Override
    public void run(String... args) throws Exception {
        loadOrderData();
    }

    private void loadOrderData() {
        if (orderRepository.count() == 0) {
            Order order1 = Order.builder()
                    .id(1001L).name("Moon chairs")
                    .price(58.0)
                    .createTime(LocalDateTime.of(2024, 04, 01, 22, 10, 10))
                    .build();
            Order order2 = Order.builder()
                    .id(1002L).name("Outdoor canopy black coating")
                    .price(98.0)
                    .createTime(LocalDateTime.of(2024, 04, 01, 22, 10, 10))
                    .build();
            Order order3 = Order.builder()
                    .id(1003L).name("Outdoor canopy silver coating")
                    .price(48.0)
                    .createTime(LocalDateTime.of(2024, 04, 01, 22, 10, 10))
                    .build();
            orderRepository.save(order1);
            orderRepository.save(order2);
            orderRepository.save(order3);
        }
    }
}

5. 新建持久层单元测试

@DataJpaTest
@Import(InitData.class)
public class OrderRepositoryTest {

    @Autowired
    OrderRepository orderRepository;

    @Test
    void test_findAllByNameLike() {
        List<Order> list = orderRepository.findAllByNameLike("%Outdoor%");
        assertEquals(2, list.size());
    }

    @Test
    void test_findAllByNameLike_Empty() {
        List<Order> list = orderRepository.findAllByNameLike("%Outdoor folding chair%");
        assertEquals(0, list.size());
    }

    @Test
    void test_findAllByPriceLessThan() {
        List<Order> list = orderRepository.findAllByPriceLessThan(50d);
        assertEquals(1, list.size());
    }

    @Test
    void test_findAllByPriceLessThan_Empty() {
        List<Order> list = orderRepository.findAllByPriceLessThan(10d);
        assertEquals(0, list.size());
    }

    @Test
    void test_saveOrder() {
        Order order4 = Order.builder()
                .id(1004L).name("Outdoor folding chair")
                .price(28.0)
                .createTime(LocalDateTime.of(2024, 04, 01, 22, 10, 10))
                .build();
         orderRepository.save(order4);
        long count = orderRepository.count();
        assertEquals(4, count);
    }

    @Test
    void test_saveOrder_NameIsTooLong() {
        Order order4 = Order.builder()
                .id(1004L).name("Outdoor folding chair Outdoor folding chair Outdoor folding chair Outdoor folding chair Outdoor folding chair")
                .price(28.0)
                .createTime(LocalDateTime.of(2024, 04, 01, 22, 10, 10))
                .build();
        order4 = orderRepository.save(order4);
        try {
            orderRepository.flush();
            fail("Name is null");
        } catch (ConstraintViolationException cve) {
            assertTrue(validate(cve, "size must be between 0 and 50", "name"));
        }
    }

    @Test
    void test_saveOrder_NameIsNull() {
        Order order4 = Order.builder()
                .id(1004L)
                .price(28.0)
                .createTime(LocalDateTime.of(2024, 04, 01, 22, 10, 10))
                .build();
        try {
            order4 = orderRepository.save(order4);
            orderRepository.flush();
            fail("Name is null");
        } catch (ConstraintViolationException cve) {
            assertTrue(validate(cve, "must not be null", "name"));
        }
    }

    private boolean validate(ConstraintViolationException cve, String message, String fieldName) {
        return cve.getConstraintViolations().stream()
                .anyMatch(e -> {
                    boolean hasMessage = e.getMessage().contains(message);
                    Iterator<Path.Node> itr = e.getPropertyPath().iterator();
                    boolean matchedFieldName = false;
                    while (itr.hasNext()) {
                        Path.Node pNode = itr.next();
                        matchedFieldName = pNode.getName().equals(fieldName);
                        if (matchedFieldName) {
                            break;
                        }
                    }
                    return hasMessage && matchedFieldName;
                });
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1568558.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言----数据在内存中的存储

文章目录 前言1.整数在内存中的存储2.大小端字节序和字节序判断2.1 什么是大小端&#xff1f;2.2 练习 3.浮点数在内存中的存储3.1.引子3.2.浮点数的存储3.2.2 浮点数取的过程 前言 下面给大家介绍一下数据在内存中的存储&#xff0c;这个是一个了解c语言内部的知识点&#xf…

动规训练3

一、按摩师 1、题目解析 简而言之就是&#xff0c;找到一个按摩师的预约总是长的最长方案&#xff0c;还有一个限制条件&#xff0c;选取的预约两两不相邻。 2、算法原理 a状态表示方程 小技巧&#xff1a;经验题目要求 dp[i]表示以这个节点为结尾&#xff0c;最长的预约时…

【C语言】翻译环境与运行环境

一、前言 在我们学习C语言的时候&#xff0c;第一个接触的程序就是&#xff1a;在屏幕上打印” hello word! “&#xff0c;可当时的我们却未去深入的理解与感悟&#xff0c;一个程序代码是如何运行的&#xff1b;而这一期的博客&#xff0c;则是带着我们&#xff0c;通过C代码…

Python | SLP | EOF | 去除季节趋势

EOF & PC 前言 在计算EOF&#xff08;经验正交函数&#xff09;之前去除季节循环是为了消除数据中的季节变化的影响&#xff0c;使得EOF能够更好地捕捉数据中的空间变化模式。如果不去除季节循环&#xff0c;季节性信号可能会在EOF中占据较大的比例&#xff0c;从而影响对其…

材料物理 笔记-4

原内容请参考哈尔滨工业大学何飞教授&#xff1a;https://www.bilibili.com/video/BV18b4y1Y7wd/?p12&spm_id_frompageDriver&vd_source61654d4a6e8d7941436149dd99026962 或《材料物理性能及其在材料研究中的应用》&#xff08;哈尔滨工业大学出版社&#xff09; 离…

浙大恩特客户资源管理系统 RegulatePriceAction SQL注入漏洞复现

0x01 产品简介 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源,提升销售和市场营销的效果。 0x02 漏洞概述 浙大恩特客户资源管理系统 RegulatePriceAction接口存在 SQL 注入漏洞,攻击者可通过输入恶意 SQL …

信息传播的AI时代:机器学习赋能新闻出版业的数字化之旅

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

layui框架实战案例(26):layui-carousel轮播组件添加多个Echarts图标的效果

在Layui中&#xff0c;使用layui-carousel轮播组件嵌套Echarts图表来实现多个图表的展示。 css层叠样式表 调整轮播图背景色为白色&#xff1b;调整当个Echarts图表显示loading…状态&#xff1b;同一个DIV轮播项目添加多个Echarts的 .layui-carousel {background-color: #f…

黄锈水过滤器 卫生热水工业循环水色度水处理器厂家工作原理动画

​ 1&#xff1a;黄锈水处理器介绍 黄锈水处理器是一种专门用于处理“黄锈水”的设备&#xff0c;它采用机电一体化设计&#xff0c;安装方便&#xff0c;操作简单&#xff0c;且运行费用极低。这种处理器主要由数码射频发生器、射频换能器、活性过滤体三部分组成&#xff0c;…

GPT-3.5开放免费使用,这次OpenAI做到了真的open

本周一&#xff0c;OpenAI宣布&#xff0c;部分地区的ChatGPT网站访问者现在无需登录即可使用人工智能助手。 此前&#xff0c;该公司要求用户创建账户才能使用&#xff0c;即使是目前由GPT-3.5AI语言模型支持的免费版ChatGPT也是如此。 01.GPT-3.5开放免登录使用 众所周知&…

mysql+keepalive+lvs搭建的数据库集群实验

前提条件&#xff1a;准备5台计算机&#xff0c;且网络互通 1、客户端 yum groups -y install mariadb-client ip 192.168.0.5 2、lvs1 yum-y install ipvsadm keepalived ip 192.168.0.1 keepalivedvip 192.168.0.215 /etc/hosts 解析192.168.0.1 主机名 3、lvs2 yum-y i…

生成式人工智能与 LangChain(预览)(下)

原文&#xff1a;Generative AI with LangChain 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 六、开发软件 虽然这本书是关于将生成式人工智能&#xff0c;特别是大型语言模型&#xff08;LLMs&#xff09;集成到软件应用程序中&#xff0c;但在本章中&#xff0c;…

C++模板基础1——定义函数模板

函数模板定义格式 模板函数定义格式如下&#xff1a; template <typename T> 返回类型 函数名(参数列表) {// 函数体 }其中&#xff0c;template<typename T>是模板声明&#xff0c;用于定义模板参数 T。可以使用不同的关键字代替 typename&#xff0c;例如 clas…

4大企业实例解析:为何MongoDB Atlas成为AI服务构建的首选

随着人工智能和生成式AI技术的迅猛发展&#xff0c;众多企业和机构正积极利用自然语言处理&#xff08;NLP&#xff09;、大型语言模型&#xff08;LLM&#xff09;等前沿技术&#xff0c;打造出一系列AI驱动的产品、服务和应用程序。 本文将展示四家已在AI创新领域取得显著成…

【MATLAB】PSO_BP神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 基本定义 PSO_BP神经网络时序预测算法是一种结合了粒子群优化(PSO)算法和反向传播(BP)神经网络的时序预测方法。它利用了PSO算法的全局搜索能力和BP神经网络的优化能力&#xff0c;能够更准确地预测时序数据。 具体步…

【随笔】Git -- 高级命令(上篇)(六)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

练习 19 Web [BJDCTF2020]Easy MD5

如果你是第一批做这个题的&#xff0c;这道题一点也不easy 打开在前端代码里面看到&#xff0c;输入框输入的内容实际是’password’ 随意输入内容&#xff0c;查看响应header中的内容有一句SQL代码&#xff0c;可知我们要让password在md5后返回值为true 然后尬住&#xff…

3月造车新势力销量出炉:问界继续领跑,哪吒下滑,岚图抢眼

进入4月份&#xff0c;各大造车新势力们纷纷公布了3月份最新销量成绩&#xff0c;根据相关数据显示&#xff0c;问界再度超越理想&#xff0c;夺得造车新势力头名的位置。而零跑、蔚来、小鹏的销量也实现不错的增长&#xff0c;岚图汽车的表现同样十分亮眼。不过日前遭到周鸿祎…

C/C++程序的(编译,链接)翻译与运行

目录 前言&#xff1a; 1.程序环境 2.翻译环境 3.预处理&#xff08;预编译&#xff09; 4.编译 5.汇编 6.链接 7.运行环境 总结&#xff1a; 前言&#xff1a; 本篇来解释c/c程序的翻译环境与运行环境中的过程&#xff0c;不同的编程语言的翻译环境类似&#xff0c;…

[每周一更]-第92期:Go项目中的限流算法

这周五在清明假期内&#xff0c;提前更新文章 很多业务会有限流的场景&#xff0c;比如活动秒杀、社区搜索查询、社区留言功能&#xff1b;保护自身系统和下游系统不被巨型流量冲垮等。 在计算机网络中&#xff0c;限流就是控制网络接口发送或接收请求的速率&#xff0c;它可防…