错误信息如下: java.lang.NullPointerException at com.usvisatrack.common.data.tests.jpa.UserRepositoryTest.testInsert...问题和解决 尽管我们在测试中定义了: private UserRepository userRepository; 很显然的是 Spring 没有 Autowired。...主要原因是因为 Spring 的测试严重依赖 Spring。 我们没有对 Spring 进行初始化,是不能进行测试的。...需要注意的就是,对 Spring 进行任何测试,包括测试 JPA 或者 API ,都需要对 Spring 进行初始化。...https://www.ossez.com/t/spring-data-repository/14071
,单测要覆盖到方法中的每一行代码 自动断言:每一段单测代码都应该有自己的断言方法,而不是通过打印再人工查看正确性 所以我们就有了Mockito,它可以模拟对象,模拟对象方法的返回值,来完成mock...本文使用的是PowerMockito,它是由Mockito的基础上开发而来,语法规则基本一致,同时也有一些自己的增强,可以对静态方法,局部变量进行mock。...import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Data...lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; @Data...powerMockitoMapper; @Override @Transactional(rollbackFor = Exception.class) public void saveOrUpdate
它还会检测测试中可用的未使用的存根, 并使用@Mock注释对模拟进行初始化。 @InjectMocks 它标记应在其上执行注入的字段或参数。 @Captor 它允许创建字段级参数捕获器。...它与Mockito的verify()方法一起使用, 以获取调用方法时传递的值。 @Spy 允许创建部分模拟的对象。换句话说, 它允许将现场实例快速包装在测试对象中。...(String.class);//捕获参数的对象 listO.add(param);//mock对象执行add方法,将test添加进其中 verify(listO)....add(paramObject.capture());//捕获参数 Assert.assertEquals("我是一个参数", paramObject.getValue());//断言验证...@Mock 是一个实例里面的一个注入对象,对应的是spring的一个bean。
前言 异常的处理在我们的日常开发中是一个绕不过去的坎,在Spring Boot 项目中如何优雅的去处理异常,正是我们这一节课需要研究的方向。...异常的分类 在一个Spring Boot项目中,我们可以把异常分为两种,第一种是请求到达Controller层之前,第二种是到达Controller层之后项目代码中发生的错误。...,添加一个新的异常时,仅仅添加枚举类中的字段和properties文件中的属性。...使用ControllerAdvice对其他类型的异常进行处理 类似于到达Controller之前的请求参数错误,请求方式错误,数据格式不对等等错误都归类为一种,这里仅仅展示请求方式错误的处理方式。...param e 捕获的异常 * @return 封装的返回对象 **/ @ExceptionHandler(Exception.class) public ReturnVO
:mockito-core:1.10.19' } (2)配置Build Variants,选择Unit Tests ?...Android Annotation对EBean类的构造函数有个限制,要么不提供构造函数只用默认的构造函数,要么提供一个只包含参数Context的构造函数。...); oos.close(); } catch (Exception e) {//NPE e.printStackTrace();...; } } (4)配置测试的运行参数 ?...前者只运行当前测试的运行参数中配置的测试类和方法,而后者会检测整个项目中的所有Unit Test并进行测试。 上面四个测试中只有前三个是通过的,最后一个没能通过。
接口层应该实现如下目标(参考:SpringMVC4.1之Controller层最佳实践): 统一的响应体、请求体,规避Map、List作参数或者响应结果的方式(尤其是参 - 数用Map来包装,这种代码有时候看起来真的让人很沮丧...) 统一的错误信息 统一的请求数据校验 统一的接口异常捕获 MySQL建表的时候,可以按照下列顺序考虑 表名,以及备注 字段定义,以及备注,注意按照下列顺序定义字段!...中不能通过new一个实例来使用,否则在mockito测试的时候没法预设行为;在spring中要使用其他组件,必须通过xml或者注解方式,由spring容器负责装配。...单元测试,推荐使用Mockito框架,理由有三:(1)可专注于被测试对象;(2)不需要建立复杂的bean依赖关系;(3)DSL描述性语言简单易懂。...参考文章:反模式的经典 - Mockito设计解析 在项目开发中,建议配合使用Mockito和Assertj写单元测试。
微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。...微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。...【推荐】 防止 NPE,是程序员的基本修养,注意 NPE 产生的场景: 1)返回类型为基本数据类型, return 包装数据类型的对象时,自动拆箱有可能产生 NPE。...3) 集合里的元素即使 isNotEmpty,取出的数据元素也可能为 null。 4) 远程调用返回对象时,一律要求进行空指针判断,防止 NPE。...正例: 一个类中有多个 public 方法,都需要进行数行相同的参数校验操作,这个时候请抽取: private boolean checkParam(DTO dto) {...}
;有时候 Service 调用 biz 层接口时,参数传错了,而由于开发人员编写单元测试时不规范,参数匹配使用了 anyxxx(),导致参数传错的 bug 未被发现。...=root spring.datasource.password= schema 初始化: ......spring 配置文件路径, SpringockitoContextLoader指定了加载配置的类,这两个一起用可以支持在使用 spring xml 配置的同时可以将 mockito 生成的 mock...及 mockito,利用 spring-test 集成 springockito 将 mock 的 bean 注入到 Spring 上下文中。
添加依赖 在 pom.xml 中添加 spring-boot-starter-data-redis的依赖 org.springframework.boot...其中 # 号代表这是一个 SpEL 表达式,此表达式可以遍历方法的参数对象,具体语法可以参考 Spring 的相关文档手册。...) key: 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合(如:@Cacheable(value="user",key="#userName...= "#id",condition = "#id < 10")) @CachePut(根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用) key...#cache-introduction spring-data-redis文档: https://docs.spring.io/spring-data/redis/docs/2.0.1.RELEASE/
选出自己需要的一些组件生成项目即可,我这里选了如下几个: Web: Web项目 JPA: 数据库持久层采用Spring Data JPA,方便实用 Lombok: 可以通过注解大量减少Java中重复代码的书写...data.sql)的 SQL 脚本。...(0).getTitle()); } } 这样就完成了 DAO 层代码的测试,以上程序主要依托于内存数据库 HSQLDB 和 Spring Data JPA。...Mockito.verify(blogRepository).save(Mockito.any()); } /** * 测试根据博客ID来修改该博客的名称失败时的情况....title=Spring实战")) .andExpect(status().isOk()); } /** * 测试修改博客标题失败时的情况.
4、数据传递与参数绑定 现在已经可以实现请求分发与响应功能了,那么如果页面的数据需要在请求时才渲染要怎么做,换句话说,数据传递要怎么办?这时可以将数据放置在request域中,在页面去取出对应的数据。...username="test" 时也可以在控制器中成功打印结果。 现在我们解决了参数名不一致的获取问题,那么如果不带参数访问呢?实测会抛异常,因为默认是需要传入参数的。...为此该注解还有一个属性:required ,它表示请求参数中是否必须携带指定的参数。默认值是 true 。还有一个属性 defaultValue,它可以指定参数不传递时的默认值。...,而@ExceptionHandler 是SpringMVC提供的注解,用于声明式地捕获指定的异常。...("exception",npe.getMessage()); return mv; } } 如果全局和本类都有配置异常处理,那么本类的优先;如果捕获异常的处理器有多个,那么精确的优先
的依赖 org.springframework.boot spring-boot-starter-data-redis...其中 # 号代表这是一个 SpEL表达式,此表达式可以遍历方法的参数对象,具体语法可以参考 Spring 的相关文档手册。..."#id",condition="#id < 10")) @CachePut(根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用) key: 同上 value...,缺省情况下,如果方法执行抛出异常,则不会清空缓存(如: @CacheEvict(value="user",key="#id",beforeInvocation=true)) 总结 spring-data-redis...文档: https://docs.spring.io/spring-data/redis/docs/2.0.1.RELEASE/reference/html/#new-in-2.0.0 Redis 文档
本文主要比较一下二者操作实体类的方法的关系和区别。 本文适用 Hibernate:4.3.11.Final 和 spring-data-jpa:1.10.4.RELEASE 。...方法对比 session的方法: flush() evict() load() save() saveOrUpdate() update() merge() persist() delete() refresh...S.load() = E.getReference() 执行查询时返回代理对象,这是懒加载。spring-data-jpa中对应getOne(); 如果数据库中没有对应的记录,抛异常。...注:这里spring-data-jpa又任性了,getOne()不是对应get(),注意。还有更任性的,如果对象在缓存中的话,那么getOne就会返回实体对象,否则返回代理对象。...S.get() = E.find() 执行查询时返回实体对象,立即加载。spring-data-jpa中对应findOne(); 如果数据库中没有对应的记录,则返回null。
)捕获方法参数进行验证。...(可代替参数匹配器使用) 在某些场景中,不光要对方法的返回值和调用进行验证,同时需要验证一系列交互后所传入方法的参数。那么我们可以用参数捕获器来捕获传入方法的参数进行验证,看它是否符合我们的要求。...ArgumentCaptor 介绍 通过 ArgumentCaptor 对象的 forClass (Class ArgumentCaptor 的 Api argument.capture () 捕获方法参数...中文文档 (部分):单元测试利器-Mockito 中文文档_mockito官网文档-CSDN博客 Mockito 使用教程:Mockito教程 - 明-Ming - 博客园 参数捕获器使用:https...://www.journaldev.com/21892/mockito-argumentcaptor-captor-annotation 利用 ArgumentCaptor(参数捕获器)捕获方法参数进行验证
在启用该注解时,Spring Boot 将根据类路径和配置文件中的信息来尝试猜测并配置应用程序。...; } } @RequestParam @RequestParam 注解用于将请求参数映射到方法的参数中。...,下次调用该方法时,如果参数和之前相同,则返回缓存结果。...Data JPA 功能。...它会自动配置 Spring Data JPA 相关的 Bean。
Mockito 是一种 Java mock 框架,他主要是用来做 mock 测试的,他可以模拟任何 Spring 管理的 bean、模拟方法的返回值、模拟抛出异常...等,在了解 Mockito 的具体用法之前...Mockito 简介 说完了 mock 测试的概念,接下来我们进入到今天的主题,Mockito Mockito 是一种 Java mock 框架,他主要就是用来做 mock 测试的,他可以模拟任何 Spring...管理的 bean、模拟方法的返回值、模拟抛出异常...等,他同时也会记录调用这些模拟方法的参数、调用顺序,从而可以校验出这个 mock 对象是否有被正确的顺序调用,以及按照期望的参数被调用 像是 Mockito...()方法,并且参数为3时,就返回id为200、name为I'm mock3的user对象 Mockito.when(userDao.getUserById(3)).thenReturn(...thenThrow 系列方法 当调用 userService 的 getUserById() 时的参数是 9 时,抛出一个 RuntimeException Mockito.when(userService.getUserById
【强制】捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类。 说明:如果预期对方抛的是绣球,实际接到的是铅球,就会产生意外情况。 9....反例:足迹服务引入了高版本的 spring,导致运行到某段核心逻辑时,抛出 NoSuchMethodError 错误,catch 用的类却是 Exception,堆栈向上抛,影响到上层业务。...【推荐】防止 NPE,是程序员的基本修养,注意 NPE 产生的场景: 1)返回类型为基本数据类型,return 包装数据类型的对象时,自动拆箱有可能产生 NPE 反例:public int method...) 为真时(Slf4j 的常见实现 Log4j 和Logback),就直接 return,但是参数可能会进行字符串拼接运算。...记录日志时请思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处? 12.【推荐】可以使用 warn 日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适从。
但是,覆盖率仅仅是测试质量的一个度量标准,不是唯一的评估指标。在设计测试用例时,还需要考虑测试的全面性、边界条件、异常处理等因素。...,有助于捕获系统级别的问题和潜在的集成错误。...集成测试将焦点放在不同模块、组件或系统之间的协同工作上,确保整个应用程序在集成时表现出预期的行为。...在 Spring Boot 中,使用 @SpringBootTest 注解和各种模拟技术,可以测试应用程序的不同层次和组件之间的集成点。集成测试有助于捕获系统级别的问题,提高整个应用程序的稳定性。...页面测试是确保 Web 应用程序用户体验的重要一环,有助于捕获与页面交互相关的问题,提高应用程序的整体质量。在软件开发过程中,这三种测试形式相辅相成,构建了一个全面的测试策略。
如果使用的 @SpringBootTest 注解不带任何参数,则默认为 Mock 环境。...真实环境测试 在 @SpringBootTest 注解中指定基于随机端口的真实Web环境,然后在类成员变量或者方法参数上注入 TestRestTemplate 实例,就可以完成对 Spring MVC接口的真实环境测试...Mock 环境测试 通过在类上面使用 @AutoConfifigureMockMvc 注解,然后在类成员变量或者方法参数上注入MockMvc 实例,就可以完成对 Spring MVC 接口的 Mock...Spring Boot 提供了一个 @MockBean 注解,可为 Spring 中的 Bean 组件定义基于 Mockito 的Mock 测试,它可以创建一个新 Bean 以覆盖 Spring 环境中已有的...注解指定,然后通过Mockito 提供的代理工具类方法创建模拟返回数据,运行该服务的测试方法,当模拟数据和预期结果一致时才会测试通过。
领取专属 10元无门槛券
手把手带您无忧上云