Spring中的测试Service和Controller方式

Spring对Controller、Service、Dao进行Junit单元测试 1、在pom.xml中引入测试的Jar包 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version& 阅读详情

spring-test和junit下载

使用

@Test     @Before    @After三个注解的使用

package org.anonymous.note.dao.test.imple;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class TestDemo {
	
	/**
	 * 每个测试方法开始测试的时候都会初始化
	 */
	@Before
	public void init(){
		System.out.println("初始化....");
	}
	
	
	/**
	 * 每一个测试方法结束的时候.销毁都会调用此方法
	 */
	@After
	public void destory(){
		System.out.println("销毁");
	}
	
	//带@Test都是测试方法
	@Test
	public void test1(){
		System.out.println("测试1");
	}
	
	@Test
	public void test2(){
		System.out.println("测试2");
	}
	/**
	 * 结果:
	 * 初始化....
		测试2
		销毁
		初始化....
		测试1
		销毁

	 */
	
}

Runs:表示测试的方法个数

Errors:表示错误点可以在Failure  Trace中查看..控制台查看不了

Failures:表示业务逻辑是否正确

右边的状态栏..如果是绿色是正常..没有什么问题,

同时执行所有的带@Test的方法/在不同的类与类之间

注解使用

@RunWith(Suite.class)

@SuiteClasses({测试类类名1.class,...,测试类类名n.class})

package org.anonymous.note.dao.test.imple;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({TestDemo.class,TestClass.class})
public class RunWites {

}



测试Service层

测试登录模块的Service


@Resource
	private UserDao userDao;
	/**
	 * 登录模块业务处理
	 */
	@Override
	public NoteResult checkLogin(
			String username, String password) throws Exception {
		NoteResult result = new NoteResult();	
		User user = userDao.findByName(username);
		if(user==null){
			result.setStatus(1);
			result.setMsg("用户名不存在");
			return result;
		}
		//对用户的密码进行加密
		String md5_base64_password = NoteUtil.md5_base64(password);
		if(!user.getCn_user_password().equals(md5_base64_password)){
			result.setStatus(2);
			result.setMsg("密码不正确");
			return result;
		}
		result.setStatus(0);
		result.setMsg("用户名和密码正确!");
		result.setData(user.getCn_user_id());
		return result;
	}

测试类

package org.anonymous.note.dao.test.imple;

import javax.annotation.Resource;

import org.anonymous.note.dao.UserDao;
import org.anonymous.note.entiry.NoteResult;
import org.anonymous.note.service.UserService;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestService {
	
	@Resource
	private UserDao userDao;
	
	private UserService userService ;
	@Before
	public void init(){
		ApplicationContext context = 
				new  ClassPathXmlApplicationContext(
						"applicationContext.xml");
		userService = context.getBean(
				"userServiceImple",UserService.class);
	}
	@Test
	public void test1() throws Exception{
		NoteResult result = 
				userService.checkLogin("demo", "1234");
		//验证返回的结果是否正确,也就是业务逻辑是否正确
		Assert.assertEquals(0, result.getStatus());
	}
	@Test
	public void test2() throws Exception{
		NoteResult result = 
				userService.checkLogin("demo", "23");
		//验证返回的结果是否正确,也就是业务逻辑是否正确
		Assert.assertEquals(2, result.getStatus());
	}
	@Test
	public void test3() throws Exception{
		NoteResult result = 
				userService.checkLogin("demo23", "123445");
		//验证返回的结果是否正确,也就是业务逻辑是否正确
		Assert.assertEquals(1, result.getStatus());
	}
}

Junit控制台(结果没有逻辑错误或者是报错)

现在我将Test1中的Assert.assertEquals(0, result.getStatus());改为Assert.assertEquals(1, result.getStatus());

就会出现逻辑错误


原因:结果的返回的值是0..你程序员给的值是1..两个值程序判断错误,就会出现逻辑错误

例子:

加入A商品=10000    如今要打折处理打折0.7

也就是A商品=7000

进行业务逻辑处理的时候

Assert.assertEquals(7000, 商品打折之后的价格);

两这进行比较,,.如果不相同.就会出现业务逻辑错误..

相比以前.我们是用控制台进行查看验证,现在使用JUnit可以根据状态来查看

测试Controller层

固定格式:

@RunWith(SpringJUnit4ClassRunner.class)//加运行类加入容器中
@ContextConfiguration(
		locations={"classpath:applicationContext.xml"})//指定配置文件

package org.anonymous.note.dao.test.imple;

import javax.annotation.Resource;

import junit.framework.Assert;

import org.anonymous.note.controller.user.LoginController;
import org.anonymous.note.entiry.NoteResult;
import org.anonymous.note.service.UserService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import com.fasterxml.jackson.databind.ObjectMapper;

@RunWith(SpringJUnit4ClassRunner.class)//加运行类加入容器中
@ContextConfiguration(
		locations={"classpath:applicationContext.xml"})//指定配置文件
public class TestController {
	@Resource
	private LoginController loginController;
	
	private MockMvc mockmvc;
	
	@Before
	public void init(){
		mockmvc = MockMvcBuilders.standaloneSetup(
				loginController).build();
	}
	
	@Test
	public void test1() throws Exception{
		//发送请求
		MockHttpServletRequestBuilder requestBuilder = 
					MockMvcRequestBuilders.post("/user/login.do");
		//发送请求参数
		requestBuilder.param("username", "demo").param("password","1234" );
		//发送请求.获取请求返回的结果
		MvcResult result = mockmvc.perform(requestBuilder).andReturn();
		String content = result.getResponse()
					.getContentAsString();
		System.out.println(content);
		/**
		 * 到这里就是获取到响应的结果了
		 * {"status":0,
		 * "msg":"用户名和密码正确!",
		 * "data":"48595f52-b22c-4485-9244-f4004255b972"}
		 * 怎么是一个JSON数据?
		 * 这里就要将JSON数据转换为NoteResult对象
		 */
		
		//为了断言.将JSON数据转换为NoteResult对象
		ObjectMapper mapper = new ObjectMapper();
		//将JSON转换为NoteResult
		NoteResult note = 
				mapper.readValue(content, NoteResult.class);
		Assert.assertEquals(0, note.getStatus());
	}
}

springMVC中controller层单元测试例子及注意事项 4.x版本的spring控制层单元测试,推荐使用集成web环境的mock,即mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();这种方式更贴近真实情况,完整例子如下:import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.j... 阅读详情

相关推荐

Simulink实战:5步搞定固定翼飞行器六自由度动力学建模(附模型下载)

本文提供了一份详细的Simulink实战指南,通过5个核心步骤手把手教你构建固定翼飞行器的六自由度动力学模型。内容涵盖从顶层架构设计、核心方程手动实现,到模型集成、测试调试及进阶优化的完整流程,旨在帮助航空航天学生和工程师将抽象理论转化为可运行的仿真模型,并附有模型下载。

perl8的博客 634

SpringBoot测试用例

@RunWith(SpringRunner.class) 如何运行这个测试类,这里用SpringRunner运行测试用例 @SpringBootTest 代表这是一个测试类 @Test 测试方法 WEB项目需一个MVC环境 搭建一个简单Spring Boot的被测试环境 新建一个User对象 package com.user.domain; public class User { priv...

l_learning的博客 1265

富士SC2022,C325,C328打印机扫描到网络详细教程

富士打印机SC2022,C328,C325等型号扫描到电脑教程

weixin_41926602的博客 1万+

spring-test几种用法

maven: 4.3.4.RELEASE org.springframework spring-test ${spring_version} test junit junit 4.12 test @RunWith(SpringJUnit4ClassRunner.class) @ContextConfigu

ZYJ_2012的博客 2332

小白 虚拟机 kali_Linux安装 详细教程

安装版本:VMmare workstation pro kali_Linux 安装环境:Window10 首先我们先了解一下什么是kali_linux: Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统。每一季度更新一次。由Offensive Security Ltd维护和资助。最先由Offensive Security的Mati Aharoni和Devon Kearns通过重写BackTrack来完成,BackTrack是他们之前写的用于取证的Linux发行

m0_50917178的博客 9万+

APM 飞行模式切换--源码详解

APM飞控中有很多种方式可以改变飞行模式。其中最常见的为遥控器切换和地面站切换两种方式。 下面以遥控器切换为例详解飞行模式切换逻辑。 APM遥控器切换飞行模式的源代码在RC_Channel.cpp文件中的RC_Channel_Copter::do_aux_function_change_mode()函数中。 const bool success = copter.set_mode()调用Copter::set_mode()函数,在set_mode()函数中调用mode_fro...

qq_30623591的博客 2440

spring controller 方法测试

controller 测试 不使用其他api接口测试工具 一般而言,我们写好一个模块后,会对其进行单元测试,再集成到现有的系统中。 但是呢~针对Controller、Service、Dao三层来说,我们最常的是对Service和Dao进行单元测试。然而Controller的测试,很多人还是启动Tomcat,使用Postman进行api测试,这样不仅需要等待很长的编译部署时间,而且无法逐个Con...

weixin_30423977的博客 903

深度学习在传感器数据分析中的创新应用

传感器是物理世界与数字世界的“接口”,其生成的高维、时序、多源数据蕴含着设备状态、环境变化、用户行为等关键信息。传统传感器数据分析依赖手工特征工程与简单机器学习模型,难以应对复杂场景下的非线性、长程依赖与实时性需求。深度学习通过自动特征提取非线性建模与端到端学习,成为传感器数据处理的革命性工具。本文从概念基础理论框架架构设计实现机制到实际应用,系统拆解深度学习与传感器数据的融合逻辑,结合工业预测维护医疗健康监测智能交通等场景,揭示其技术边界与未来演化方向。

大数据洞察的博客 568

spring-test的用法

package sy.test; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.con

u012102536的博客 1193

一文吃透 SAP HANA Service Broker:原理、架构与落地实践

摘要:SAP HANA Service Broker 作为云原生开发的关键组件,通过标准化流程管理 HDI 容器与服务实例的生命周期,实现数据库资源的自动化配置与安全隔离。它采用服务目录、服务计划和绑定机制,将连接凭据注入应用环境变量,避免硬编码风险。在实际应用中,需根据模块生命周期决定共享或隔离容器,并通过跨容器访问模式实现安全数据共享。典型案例展示了电商平台的多模块协同与SaaS租户隔离场景,验证了其在提升运维效率与安全合规方面的价值。最佳实践强调以生命周期划边界、最小权限原则和HTTPS安全传输,为企

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 225

100天精通Python(可视化篇)——第98天:Pyecharts绘制多种炫酷日历图参数说明+代码实战

一、日历图介绍 二、基础配置 1. 配置项类 2. 添加函数 3. 日期标签配置 4. 坐标系配置 三、日历图实战 1. 基础日历图 2. 日历热图

努力让自己发光,对的人才能迎着光而来 2万+

单元测试实战(一)Controller 的测试

可立即实施的研发管理赋能措施。

io 5672

库存管理系统项目部署方案(基于jdk8)

不需要安装到服务器,运维本地安装就行,主要是用来编译前端代码的。构建完成后将dist文件夹复制到服务器内。

程序员诚哥 2574

【Mybatis升级版-02】mybatis与Spring整合service及controller

在【01】章中介绍了mybatis与Spring整合之后的开发流程,Spring与mybatis整合,本质上是Spring将各层进行整合,(Spring管理持久层的mapper、Spring管理业务层service、Spring管理表现层的handler)。本章将介绍Spring与service及controller进行整合的操作流程思路简单如下: 1.使用配置方式(后期会使用注解方式,显示配置

Chanson 754

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Spring Boot 分层架构详解:Controller、Service、Mapper...

本文介绍了Spring Boot项目中分层架构的设计原则与实现方法。项目通常分为Controller(处理请求响应)、Service(业务逻辑)、Mapper(数据库操作)、Model(数据结构)等层级,每层职责明确。文章详细说明了各层的功能定位、代码示例和最佳实践,并解答了常见疑问,强调分层架构在提升代码可维护性、降低耦合度方面的重要性。遵循这种分层模式能有效提升企业级后端应用开发的质量和效率。

hello! 2026

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring 第二篇(xml和注解的方式访问数据库)

当不写时,默认值是当前方法的名称 ​ 细节:当我们使用注解配置方法时,如果方法有参数,在参数前加:@Qualifier("@Bean注解中name的值"),spring框架会去容器中查找有没有可用的bean对象查找的方式和Autowired注解的作用是一样的。属性:value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。属性:value:用于指定其他配置类的字节码。​ 当我们使用Import的注解之后,有Import注解的类就父配置类,而导入的都是子配置类。

小yu别错过的博客 816

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Spring Boot框架下的单元测试

Spring Boot 提供了非常方便的测试支持,如 @SpringBootTest、@TestConfiguration 等注解,让开发者可以快速地在带有 Spring 容器上下文的环境中执行测试。mockMvc.perform(get("/users/1")) 可以模拟一次 GET 请求到 /users/1,并断言返回的 JSON 结构和内容。可以在 application-test.yml 里放测试专用配置,然后在测试时用 spring.profiles.active=test。

OKCRoss的博客 2913

SpringBoot单元测试

controller测试用mockmvc但是没必要,用postman测试就够了 service测试用以下的例子 package com.service; import com.nxx.DemoApplication; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired;

Domerobin的博客 578

springboot测试类

Controller测试类 /** * Created by zhiqi.shao on 2017/5/12. */ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes =MelonApplication.class) @WebAppConfiguration //启动一个真实web服务,然后...

dingxiaohuang4790的博客 151

单元测试代码:SpringTest+JUnit

[java] view plaincopy class="java" name="code">/**  * JUnit单元测试父类,配置了Spring的基础环境。   * 可以作为Controller、Service、Dao单元测试的父类。  *   * @author leiwen@fansunion.cn  */  public class JUnitTestBase {    

perry_zhao的博客 2247

spring(二)

一、注解 1.在xml中开启注解 2在类中使用注解注解 3创建测试类 //1.在xml中开启注解 <context:component-scan base-package="com.java.day02"></context:component-scan> //2.在类中使用注解 public interface UserServcie { public void addUser(); } @Component /*@Controller @Service

风力雾里 642

【Spring】02-Spring访问数据库的方式

XML方式访问数据库 注解方式访问数据库

XiaoChen~Coder 876

spring全注解的方式构建web三层结构

最近在看spring framework 的官方文档,看到spring的全注解的方式来dao,serviece,controller,没有xml,感觉非常的方便,所以在此记录一下 环境:maven项目,jdk1.8,spring-4.3.5 1.首先配置spring配置java类,此操作相当于原来的配置xml文件,java类如下: SpringIocXmlConfig.java类 pa

bug程序猿的博客 1131

SpringBoot单元测试实战:Mockito+JUnit5集成测试最佳实践

在Spring Boot项目的开发过程中,单元测试是保证代码质量、提高可维护性的重要手段。JUnit 5是Java生态系统中广泛使用的测试框架,而Mockito则是一个强大的Mocking框架,用于模拟对象和行为。将Mockito和JUnit 5集成到Spring Boot项目中,可以帮助我们更高效地编写单元测试。本文将详细介绍如何在Spring Boot项目中集成Mockito和JUnit 5,并给出最佳实践。

梵心白莲的博客 1317

spring boot 简单实现用户数据库密码的修改(后台全部步骤,链接数据库建一个用户表就可以测试)

今天用spring boot 简单写了一个密码修改需要调用的接口, 前端传回来的参数:原密码,新密码,用户名, 注意:我写servicel逻辑处理层,用的是加密方式,我注释掉了,实际运用中都是这种方式,不会让你看到真正的密码的,都是经过加密处理的,为了简单让你们看懂逻辑,我把加密方式注释掉,进行明文密码修改实现,你们可以进行实际操作下。(我的已经测试成功了,就看你们的了,明文和加密都可以哦~~希望...

qq_38215042的博客 1万+

Spring ComponentScan两种实现方式

Spring ComponentScan两种实现方式

weixin_40968009的博客 362
上一篇: 关于常见的几种状态码错误的解决方案
下一篇: JAVASE复习day01-面向过程部分(只有重点)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值