基于SpringBoot打造在线教育系统(2)-- 深入学习JPA与Junit测试

简介: 现在User表已经有了,而且对应mysql数据库里面,已经建好了用户表。

1.我要添加一条用户数据

现在User表已经有了,而且对应mysql数据库里面,已经建好了用户表。

c1e2091cb029308b6e269710275c17cb.png

我琢磨着不是要做登录功能嘛,那就得先往User表里头添加一条数据啊。用mysql front直接添加肯定是可以的,不过前段时间正好看了兔子发在B站的SSM商城系统,里面好像有个地方能够直接用Junit Test测试的,虽然这个系统不是SSM,不过应该也可以吧。


对了,pom.xml里面不是有这么一段配置嘛:

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

这玩意怎么看都像是测试用的依赖啊,这是不是意味着,我就不用跟视频里面那样,去引入jar包了??

嗯,肯定是的。

##2. 做单元测试插入数据

OK,说干就干,创建一个测试包和测试类:

650e2bd87d7fdbf230c2e443c0afcaf5.png

package com.edu.test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;
@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class UserTest {
}

打上注解,额,对了,我TM好像还没写dao方法呢,赶紧去写个。

b7654adb2632a42e83a00cfdc1c96644.png

创建一个dao包,这个包里面都放持久层的类,现在添加一个UserDao的接口。兔子关于SpringBoot的文章里面已经写过怎么使用JPA了,这边依葫芦画瓢。

799e8bb92923b58894008fe5c8c26727.png

直接写一个UserDao接口,继承一下JPA,注意,包别导错了。

package com.edu.dao; 
import org.springframework.data.jpa.repository.JpaRepository;
import com.edu.entity.User;
public interface UserDao  extends JpaRepository<User, String>{
}

这样就ok了,然后,回到测试类,把这个接口注入进去。

2a438c26968c0391d35f7eb5deee34ce.png

add测试方法

  @Test
  public void addUser(){
    User user = new User();
    user.setUserName("root");
    user.setPassword("root");
    user.setCreateTime("20210103");
    user.setNickName("剽悍一小兔");
    user.setRoleId("1");//默认1是管理员
    user.setIsDelete("0");//默认不删除
    user.setIsLogined("0");//默认没有登录
    userDao.save(user);
    System.out.println("保存成功!");
  }

开始测试:

a73fcd018f42a87813225434015d6f0c.png

14ef84b45d1af37bebde476333adff54.png

62d3a6b48ebd6a97e9ceb1426894b810.png

哇,真的好了嘛,赶紧看下数据库??

d92c75caa284b41f4d3eb611efeba339.png

OK了,真的来了。

##3. 单元测试优化

我叶小凡竟然也可以举一反三啦,兔子还没出这个SpringBoot版本的测试教程呢,我就凭借自己惊人的天赋,提前搞定了,哈哈哈。

e9d610d4750e068e4065e1856de27d7c.png

兔子:“你这个单元测试还可以优化哦,亲~”


“啥情况,这不是很完美嘛?”


兔子:“这只是第一个单元测试,后面可能还会有很多其他的单元测试,你可以做一个通用的父类,这样就不用在每个测试类上打那么多注解了。”


于是,在兔子的指导下,我虽然不服,但还是照做了。


这样,在测试包下面,我们创建一个通用的测试父类。

0ec192026c15c4cbd41a9f4108a2b11a.png

package com.edu.test;
import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;
@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class BaseTest {
  @Before
    public void init() {
        System.out.println("开始测试-----------------");
    }
    @After
    public void after() {
        System.out.println("测试结束-----------------");
    }
}

然后,UserTest就继承这个父类,不用再加测试的注解了。

public class UserTest extends BaseTest{
}

验证一下,我们再写个测试方法,把刚才的数据删掉。

使用jpa进行update操作主要有两种方式:

1、调用保存实体的方法

1)保存一个实体:repository.save(T entity)


2)保存多个实体:repository.save(Iterable entities)


3)保存并立即刷新一个实体:repository.saveAndFlush(T entity)


注:若是更改,entity中必须设置了主键字段,不然不能对应上数据库中的记录,变成新增(数据库自动生成主键)或报错(数据库不自动生成主键)了


2、@Query注解,自己写JPQL语句

   @Modifying
   @Query("update ShopCoupon sc set sc.deleted = true where sc.id in :ids")
   public void deleteByIds(@Param(value = "ids") List<String> ids);

1)update或delete时必须使用@Modifying对方法进行注解,才能使得ORM知道现在要执行的是写操作


2)有时候不加@Param注解参数,可能会报如下异常:


org.springframework.dao.InvalidDataAccessApiUsageException: Name must not be null or empty!; nested exception i                is Java.lang.IllegalArgumentException: Name must not be null or empty!


以上资料摘自百度,哈哈,我该用哪一种呢?第二种方法比较亲切,直接用sql语句了,那就使用第二种吧。


按照百度到的说法,先在dao增加一个方法,自己写jpql语句,其实我也不太懂啥叫jpql语句,估计意思就是正常写sql,但是呢,字段的名字和User类里面的字段保持一致就行了。因为我发现,生成的表,还是用了下划线,是这样的:


25be6a10aeec9e3cc1250bd3ecf60602.png

于是,我就不能用下划线。

public interface UserDao  extends JpaRepository<User, String>{
  @Modifying
    @Query("update User u set u.isDelete = 1 where u.userName = :userName")
    public void deleteByUsername(@Param(value = "userName") String userName);
}

新的测试方法,我要通过userName去做删除,删除不是真的删除,而是逻辑删除。

  @Test
  public void deleteUser1(){
    userDao.deleteByUsername("root");
    System.out.println("删除成功");
  }

运行,就报错了:

org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query at … …


我靠,啥情况,我百度到的啊,怎么会错呢。


算了算了,这个不行,就换另一种方法。

兔子:“小伙子,你这样可不行啊,你好歹看下报啥错啊。。。”


“额,好吧,我看下哈!咦,这个好熟悉,TransactionRequiredException,Transaction这个单词的意思好像是那个事物吧。Required是需要的意思,莫非报错的意思是,让我加一个事物,是这样嘛?”


兔子:“别问我啊,你自己试一下不就知道了嘛!”


“好吧,我就加一个事物的注解看看。奇怪了,我明明百度的文章,哎。”


兔子:“事物一般是加在service方法里面的,你别加在dao里面啊。你想直接测试dao层的方法,这个想法没有错,不过你最好还是弄个service。”


“你的意思是,我再加一个service方法,加上事物,然后调用dao的方法?”


兔子:“嗯,或者你直接把事物加在test方法,也行的。”


说罢,兔哥帮我加上了注解,然后测试,竟然通过了。

9bb1215947cada3f5c6c213f50201dfa.png

ca48f79858624642bb6a54b4713019cb.png

603ce6ac0560e4fec76c00370312bf68.png

这么说,我找的那篇文章,其实也是对的,等下奥,我翻下链接。”

兔子:“嗯,我看看。”

“就是这个…”



相关文章
|
3月前
|
Java 测试技术 开发者
必学!Spring Boot 单元测试、Mock 与 TestContainer 的高效使用技巧
【10月更文挑战第18天】 在现代软件开发中,单元测试是保证代码质量的重要手段。Spring Boot提供了强大的测试支持,使得编写和运行测试变得更加简单和高效。本文将深入探讨Spring Boot的单元测试、Mock技术以及TestContainer的高效使用技巧,帮助开发者提升测试效率和代码质量。
370 2
|
24天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
56 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
1月前
|
安全 Java 测试技术
springboot之SpringBoot单元测试
本文介绍了Spring和Spring Boot项目的单元测试方法,包括使用`@RunWith(SpringJUnit4ClassRunner.class)`、`@WebAppConfiguration`等注解配置测试环境,利用`MockMvc`进行HTTP请求模拟测试,以及如何结合Spring Security进行安全相关的单元测试。Spring Boot中则推荐使用`@SpringBootTest`注解简化测试配置。
|
2月前
|
Java 测试技术 API
详解Swagger:Spring Boot中的API文档生成与测试工具
详解Swagger:Spring Boot中的API文档生成与测试工具
54 4
|
2月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
41 1
|
2月前
|
缓存 监控 测试技术
全网最全压测指南!教你如何测试和优化系统极限性能
大家好,我是小米。本文将介绍如何在实际项目中进行性能压测和优化,包括单台服务器和集群压测、使用JMeter、监控CPU和内存使用率、优化Tomcat和数据库配置等方面的内容,帮助你在高并发场景下提升系统性能。希望这些实战经验能助你一臂之力!
111 3
|
2月前
|
编解码 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(10-2):保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali——Liinux-Debian:就怕你学成黑客啦!)作者——LJS
保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali以及常见的报错及对应解决方案、常用Kali功能简便化以及详解如何具体实现
|
2月前
|
Java 测试技术 数据库连接
使用Spring Boot编写测试用例:实践与最佳实践
使用Spring Boot编写测试用例:实践与最佳实践
105 0
|
2月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
5月前
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架

热门文章

最新文章