iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot单元测试使用@Test没有run方法的解决方案
  • 285
分享到

SpringBoot单元测试使用@Test没有run方法的解决方案

2024-04-02 19:04:59 285人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录SpringBoot单元测试使用@Test没有run方法原因找到了springBoot写单元测试遇到的坑SpringBoot怎么写单元测试SpringBoot使用Mockito进

SpringBoot单元测试使用@Test没有run方法

吐了!一个关键字,纠错两小时,看了十几篇博客。。。。最后重新建测试类发现@Test又有用,结果发现是因为默认的Tests测试类没有public关键字!

在这里插入图片描述

在这里插入图片描述

这个破错改了两小时。。。

==后续来了:==

原因找到了

项目的时候是默认的2.3.0,所以默认创建的类结构应该是2.3.0版本的。

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

emmm。之前因为改成了2.1.7.RELEASE,版本不同,项目的结构也不同。

现在用回2.3.0RELEASE

是可以正常跑的。。。而且也没有了@RunWith注解

在这里插入图片描述

SpringBoot写单元测试遇到的坑

近期,项目需要写单元测试。我着手的项目是用SpringBoot写的。所以就简单的研究了一下如何使用。在使用中遇到不少问题,不得已换了一种方式写测试用例,写完之后总感觉不太爽。今天在Spring官网上学一个新的用法,发现这种测试方法使用后没有问题。所以来写一点笔记

SpringBoot怎么写单元测试

SpringBoot提供注解的方式编写单元测试,可以使用SpringBootTest注解来标示测试类。

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootTest{
@Test
public void method(){
}
}

这样写只能解决没有一些配置文件的测试逻辑,比如没有数据库配置、数据库连接池配置等。如果有这些配置,你就需要这样写了。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@Test
public void method(){
}

这样就可以正常运行了。

测试controller类。使用了Mock,网上大多流传的是下面这种方法,添加@WEBAppConfiguration,使用Mockmvc去进行单元测试,但是我的项目如下使用就出现了问题,执行的时候找不到Controller类,网上百度了各种方法都不管用。都会报 no bean of 'controller' type found错误。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
 public class ControllerTest { 
    private MockMvc mockMvc; 
    @Autowired
    private WebApplicationContext wac; 
    @Before // 在测试开始前初始化工作
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }
 
    @Test
    public void getMessageTest() throws Exception { 
        MvcResult mvcResult = mockMvc.perfORM(MockMvcRequestBuilders.get("/test/getMessage"))
                .andDo(MockMvcResultHandlers.print()).andReturn();
 
        int status = mvcResult.getResponse().getStatus();
        String content = mvcResult.getResponse().getContentAsString();
 
        Assert.assertTrue("success", status == 200);
        Assert.assertFalse("failed", status != 200); 
        System.out.println("content" + content);  
    }

后来换了一种方式直接new个controller。测试运行后不报no bean of 'controller' type found错误了,但是在controller中使用的service报了空指针异常NPE,传递性就很明显了,controller是new的一个对象,所以注解不起作用,service就为null。

最后通过使用@AutoConfigureMockMvc+@MockBean的方式可以实现简单的单元测试,并且不会对数据产生影响,且不会对数据库产生影响。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@AutoConfigureMockMvc
public class ImkfMessageReportControllerTest {
    
    @Autowired
    private MockMvc mvc;
 
    
    @MockBean
    private UserController userController;
 
    @Test
    public void getUserListTest() throws Exception {
        MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.get("/user/getUserList"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        String content = mvcResult.getResponse().getContentAsString();
        System.out.println("content" + content);
 
    }

SpringBoot使用Mockito进行单元测试

上面是使用MockMvc,虽然能够验证短链接甚至service代码逻辑的正确性,能够正常测试接口的问题。但是缺点也不少,比如,覆盖率并没有提升。Mockito是一个非常好用的单元测试工具,它的实现原理是继承要Mock的类,将所有的公有方法进行重写

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
 
    @Mock
    private UserMapper userMapper;
 
    @InjectMocks
    private UserService userService;
 
    @Test
    public void saveTest() throws Exception {
        User user = new User();
        user.setUserName(Long.valueOf("springBoot"));
        when(userMapper.insert(user)).thenReturn(user);
        int num = userService.save(user);
        Assert.assertEquals("success", 1, 1);  
    } 
}

使用RunwWith(MockitoJUnitRunner.class)(也可以使用SpringBootRunner.class)来进行mocktio测试,注解@Mock标记一个类或者接口是需要被mock的,在Mock的过程中就相当于@Resource,但是注意一点是Mock是继承or实现了Mock的类,所以Mock出来的方法,全是null或者返回值为null。@InjectMocks将所有的mock对象都放入需要测试的类的对象中。在上面的saveTest方法里面调用到UserMapper.insert(),那么需要对UserMapper.insert()进行打桩,设置预期返回值。

打桩的时候需要注意:传递的参数(如果有)必须为调用时的同一个对象或者相同值,如果传入的参数是一个对象,那么需要对这个对象进行打桩,再打桩这个方法。比如,when(userMapper.insert(user)).thenReturn(rUser),插入一个user对象,如果user插入之前要进行校验或者其他操作,需要对这个对象进行打桩(当然pojp对象可以直接new)。

如果插入的对象非常复杂,用构造方法来构造一个空对象,或者构造方法所用的对象不能直接构造,但是没有public的方法来设置值,该如何解决这个问题?我们知道一个对象的类可能有get方法(不一定是get,但是只要我们想获取这个对象中的参数,那么就有public的方法获取),我们可以通过Mock这个对象,在将要测试的方法体内,如果某行调用了这个对象的任意方法(toString()、equals()、get()),我们都可以以相同的参数(如果遇到参数未知可以用any(),一般都能知道)进行打桩后设置返回值,这样就能通过参数校验等环节,执行后面的代码逻辑,同时能够提高覆盖率,伪代码如下。

 @Mock
 private User user;  
 when(user.get(eq("userName"))).thenReturn("testAdmin");
 when(user.get(eq("seq"))).thenReturn(4);
 when(user.get(eq("passWord"))).thenReturn("123456");
 when(user.get(eq("u_id"))).thenReturn("654321");

通过真实测试用例测试代码

Mockito测试需要设置参数和预期返回值,在方法体中遇到的所有未知对象(除了方法体中new的对象不需要)都需要进行模拟,但是在SpringBoot代码刚刚完成的初期时,跟想模拟真实场景下进行单元测试代码问题or配置问题,那么通过自动注入的方式引入对象是一种更好的选择。

ProviderServiceImpl.java   -----服务类
 
import com.alibaba.dubbo.config.annotation.Service;
import com.example.demo.service.DemoService;
@Service
public class ProviderServiceImpl implements DemoService {
    @Override
    public String sayHello(String name) { 
        return "hello " + name + " !";
    }
} 
 
DemoApplicationTests.java  -----测试类
 
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
 
    @Resource
    DemoService providerService;
 
    @Test
    public void contextLoads() {
        String result = providerService.sayHello("Spring Boot Test");
        System.out.println("result is "+result);
       Assert.assertEquals("success","hello Spring Boot Test !" ,result);
    } 
}

这里需要注意的是DemoApplicationTests 需要跟启动类main在同一级目录下,如果跟mvc在同一层可以会出现部分bean扫描不到的情况。如目录层级很深或者程序启动比较慢的话,可以去掉SpringBootTest(去掉后就不启动程序,只会运行该测试),运行一下,测试结果如下:

通过这种注解的方式,可以测试dubbo连接(Refernce注解),可以测试controller层,Redis数据,Mysql数据,都会真实模拟,你只需要在注入你需要测试的类,在类的入口传入测试参数,在测试过程中,最好采用debug的方式,这样你可以看到每一步的数据,也便于定位程序的问题(当然也可以出现问题时使用debug)。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: SpringBoot单元测试使用@Test没有run方法的解决方案

本文链接: https://www.lsjlt.com/news/162770.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot单元测试使用@Test没有run方法的解决方案
    目录SpringBoot单元测试使用@Test没有run方法原因找到了SpringBoot写单元测试遇到的坑SpringBoot怎么写单元测试SpringBoot使用Mockito进...
    99+
    2024-04-02
  • SpringBoot单元测试使用@Test没有run方法的解决方案是什么
    SpringBoot单元测试使用@Test没有run方法的解决方案是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。SpringBoot单元测试使用@Test没有run方法重...
    99+
    2023-06-26
  • Springboot单元测试无法读取配置文件的解决方案
    目录单元测试无法读取配置文件深渊巨坑单元测试加载配置文件启动异常最初以为是配置文件路径写错了最后确认是因为xml配置问题单元测试无法读取配置文件 首先,测试类要加注解 表示该类是...
    99+
    2024-04-02
  • SpringBootTest单元测试报错的解决方案
    目录SpringBootTest单元测试报错单元测试 @mock和@SpringBootTest使用一.单元测试工具mock使用二.springboot使用@SpringBootTe...
    99+
    2024-04-02
  • SpringBoot单元测试java.lang.IllegalStateException Could not initialize plugin: interface org.mockito解决方案
      大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作...
    99+
    2023-12-22
    java spring boot 单元测试 解决方案
  • SpringBoot+TestNG单元测试的实现方法
    这篇文章主要讲解了“SpringBoot+TestNG单元测试的实现方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot+TestNG单元测试的实现方法”吧!目录背景接口测...
    99+
    2023-06-20
  • SpringBoot单元测试没有执行的按钮问题及解决
    目录单元测试没有执行的按钮问题说明解决方法单元测试没有启动按钮(另辟蹊径)大致如下图(红圈处,没有启动按钮)现状转机结论单元测试没有执行的按钮 问题说明 在搭建SpringBoot项...
    99+
    2024-04-02
  • SpringBoot对Controller进行单元测试的实现代码 附乱码解决方案
    目录Controller代码单元测试代码测试结果乱码解决Controller代码 package com.keafmd.controller; import org.sprin...
    99+
    2024-04-02
  • C/C++ 单元自动化测试解决方案总结
    目录前言一、动机1.1 方法1:使用正则表达式1.2 方法2:使用flex/bison 分析c/c++源码文件1.3 方法3:利用编译已经生成的AST 来生成代码二、效果展示2.1 ...
    99+
    2024-04-02
  • .NET Core单元测试的方法有哪些
    这篇文章主要介绍“.NET Core单元测试的方法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“.NET Core单元测试的方法有哪些”文章能帮助大家解决问题。应用程序测试...
    99+
    2023-06-30
  • Java使用Junit4.jar进行单元测试的方法
    目录一、下载依赖包二、添加到依赖三、设置 test 目录四、创建测试类五、开始测试一、下载依赖包 分别下载 junit.jar 以及 hamcrest-core.jar 二、添加到依...
    99+
    2024-04-02
  • PHP 单元测试实践中的常见问题与解决方案
    php 单元测试的常见问题:外部依赖项测试: 使用模拟框架(如 mockery)创建假的依赖项并断言其交互。私有成员测试: 使用反射 api(如 reflectionmethod)访问私...
    99+
    2024-05-06
    php 单元测试 access
  • 如何在一个解决方案中对webAPi进行调试/单元测试
    要在一个解决方案中对Web API进行调试和单元测试,可以按照以下步骤进行:1. 使用一个开发工具,如Visual Studio,创...
    99+
    2023-09-26
    webAPi
  • Java使用Junit4.jar进行单元测试的方法是什么
    今天就跟大家聊聊有关Java使用Junit4.jar进行单元测试的方法是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、下载依赖包分别下载 junit.jar 以及 hamcr...
    99+
    2023-06-25
  • SpringBoot使用AOP,内部方法失效的解决方案
    目录SpringBoot使用AOP,内部方法失效AOP切面现在有两个方法写一个简单的动态代理的例子SpringBoot使用AOP,内部方法失效 最近在使用AOP的时候,发现一个问题,...
    99+
    2024-04-02
  • 解决springboot的findOne方法没有合适的参数使用问题
    目录springboot的findOne方法没有合适的参数使用找了半天没找到是什么原因这里改为1.5.10之后SpringBoot踩过的坑之findOne()简而言之经过多次百度,我...
    99+
    2024-04-02
  • SpringBoot中使用Knife4J的解决方案
    目录一、引入依赖二、创建配置类三、常用注解3-1 @Api3-1-1 @Api 注解的常用属性,如下:3-1-2 @Api 注解的不常用属性,如下:3-2 @ApiOperation...
    99+
    2024-04-02
  • canvas无法使用rem单位的解决方案
    这篇文章主要介绍“canvas无法使用rem单位的解决方案”,在日常操作中,相信很多人在canvas无法使用rem单位的解决方案问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • SpringBoot JPA懒加载失效的解决方案(亲测有效)
    SpringBoot JPA懒加载失效 使用springBoot JPA 对两个实体类进行双向关联,并设置了懒加载,如下: 然后在查询后用到了roles,会报错, 解决办法如下:...
    99+
    2024-04-02
  • windows10没法自动检测此网络的设置解决方案
    windows10没法自动检测此网络的设置怎么办呢,客户最先进到运作,随后右键文件夹中的host选择下面的删掉,接着右键用管理员开启命令提示符,随后输入网络重设的指令,客户就能解决此类问题,下面就是具体的windows10没法自动检测此网络...
    99+
    2023-07-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作