Mockito+PowerMock+Junit单元测试

一、单元测试用途

1、日常开发团队要求规范,需要对开发需求代码进行单元测试并要求行覆盖率达到要求,DevOps流水线也会开设相关门禁阀值阻断代码提交,一般新增代码行覆盖率80%左右。

二、Mock测试介绍

1、Mock是为了解决不同的单元之间由于耦合而难于开发、测试的问题。所以,Mock既能出现在单元测试中,也会出现在集成测试、系统测试过程中。Mock 最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类或者接口有依赖,它能够帮你模拟这些依赖,并帮你验证所调用的依赖的行为。

2、Mock 测试就是在测试活动中,对于某些不容易构造或者不容易获取的比较复杂的数据/场景,用一个虚拟的对象(Mock对象)来创建用于测试的测试方法。

3、Mock重要作用

Mock是为了解决不同的单元之间由于耦合而难于开发、测试的问题。所以,Mock既能出现在单元测试中,也会出现在集成测试、系统测试过程中。

Mock 最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类或者接口有依赖,它能够帮你模拟这些依赖,并帮你验证所调用的依赖的行为。

三、Mock测试所需依赖

 1、主要引入mockito-core/powermock-core

        <dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>4.5.1</version><scope>test</scope></dependency><dependency><groupId>org.powermock</groupId><artifactId>powermock-core</artifactId><version>2.0.9</version></dependency><dependency><groupId>org.powermock</groupId><artifactId>powermock-module-junit4</artifactId><version>2.0.9</version></dependency><dependency><groupId>org.powermock</groupId><artifactId>powermock-api-mockito2</artifactId><version>2.0.9</version><scope>test</scope></dependency>

 Mockito和PowerMock都是单元测试模拟框架,用于模拟被测试类的依赖项。Mockito基于动态代理的方式实现,而PowerMock在Mockito基础上增加了类加载器以及字节码篡改技术,使其可以实现对private/static/final方法的Mock 

四、Mock的核心功能

1、Mock对象创建

Mockito.mock(List.class); // Mock对象创建

public class VerifyMockExample {@Testpublic void testVerifyMock() {List<String> mockList = Mockito.mock(List.class);// 调用Mock对象的方法mockList.add("testCode");mockList.size();// 验证mockList.add("test")是否被调用过一次Mockito.verify(mockList,Mockito.times(1)).add("testCode");// 验证size()方法是否被调用过Mockito.verify(mockList,Mockito.times(1)).size();Assert.assertFalse(mockList.size()==1);}
}

verify系列方法 

Mockito.verify/Mockito.times()验证调用次数 

·verify(mock).methodCall():验证方法被调用

· verify(mock, times(n)).methodCall():验证方法被调用n次

· verify(mock, never()).methodCall():验证方法从未被调用

或者是通过注解来实现创建

    @Mockprivate UserInfoMapper mockUserInfoMapper;@InjectMocksprivate UserInfoServiceImpl userInfoServiceImplUnderTest;

    @Testpublic void testVerifyMock2(){List<String> mockList = Mockito.mock(List.class);mockList.add("Code1");mockList.add("Code2");// 验证是否调用两次Mockito.verify(mockList,Mockito.times(2));}
 // 验证这个方法从没有被调用过Mockito.verify(userMapper, Mockito.never()).getUserById(1);userMapper.getUserById(1);// 验证这个方法至少调用了1次Mockito.verify(userMapper, Mockito.atLeastOnce()).getUserById(1);userMapper.getUserById(1);// 验证当前方法调用了2次Mockito.verify(userMapper, Mockito.times(2)).getUserById(1);

 Mockito.when()使用when和thenReturn方法配置Mock对象的行为

Mockito.when( 对象.方法名 ).thenReturn( 自定义结果) //当调用了某个 Mock 对象的方法时,就回传我们想要的自定义结果。 

thenReturn系列方法 

//当使用任何整数值调用 userService 的 getUserById 方法时,就回传一个名字为 I'm mock 3 的 User 对象。
Mockito.when(userService.getUserById(Mockito.anyInt)).thenReturn( newUser( 3, "I'm mock"));
//限制只有当参数的数字是 3 时,才会回传名字为 I'm mock 3 的 user 对象。
Mockito.when(userService.getUserById( 3)).thenReturn( newUser( 3, "I'm mock"));
//当调用 userService 的 insertUser 方法时,不管传进来的 user 是什么,都回传 100。
Mockito.when(userService.insertUser(Mockito.any(User.class))).thenReturn( 100);

thenThrow系列方法 

//当调用 userService 的 getUserById 时的参数是 8 时,抛出一个 RuntimeException。
Mockito.when(userService.getUserById( 8)).thenThrow( new RuntimeException( "mock throw exception"));
//如果方法没有返回值的话(即方法定义为 public void myMethod {...}),要改用 doThrow 抛出 Exception。
Mockito.doThrow( new RuntimeException( "mock throw exception")).when(userService.print);

 

    @Testpublic void testVerifyMock3(){List<String> mockList = Mockito.mock(List.class);// 设置Mock对象的预期行为Mockito.when(mockList.get(0)).thenReturn("mockedValue");// 断言验证返回值Assert.assertEquals("mockedValue",mockList.get(0));}

实战案例:测试一个UserInfoServiceImpl层saveUser()方法.

原始方法:

    @Transactional@Overridepublic void saveUser(UserInfo userInfo){userInfoMapper.saveUser(userInfo);}

单元测试:

    @Testpublic void testSaveUser() {// Setupfinal UserInfo userInfo = new UserInfo();userInfo.setId(0);userInfo.setUserName("userName");userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());// Run the testuserInfoServiceImplUnderTest.saveUser(userInfo);// Verify the resultsMockito.verify(mockUserInfoMapper).saveUser(new UserInfo());}

原始方法:

    @Overridepublic List<UserInfo> queryListByUserName(String userName) {return userInfoMapper.queryListByUserName(userName);}

 单元测试方法:

    @Testpublic void testQueryListByUserName() {// Setupfinal UserInfo userInfo = new UserInfo();userInfo.setId(0);userInfo.setUserName("userName");userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());final List<UserInfo> expectedResult = Arrays.asList(userInfo);// Configure UserInfoMapper.queryListByUserName(...).final UserInfo userInfo1 = new UserInfo();userInfo1.setId(0);userInfo1.setUserName("userName");userInfo1.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());userInfo1.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());final List<UserInfo> userInfos = Arrays.asList(userInfo1);when(mockUserInfoMapper.queryListByUserName("userName")).thenReturn(userInfos);// Run the testfinal List<UserInfo> result = userInfoServiceImplUnderTest.queryListByUserName("userName");// Verify the resultsassertThat(result).isEqualTo(expectedResult);}@Testpublic void testQueryListByUserName_UserInfoMapperReturnsNoItems() {// Setupwhen(mockUserInfoMapper.queryListByUserName("userName")).thenReturn(Collections.emptyList());// Run the testfinal List<UserInfo> result = userInfoServiceImplUnderTest.queryListByUserName("userName");// Verify the resultsassertThat(result).isEqualTo(Collections.emptyList());}

 原始方法:

    @Overridepublic List<UserInfo> queryUserInfoList(String createTime, List<Integer> idList) {return userInfoMapper.queryListByIds(createTime,idList);}

 单元测试方法:

    @Testpublic void testQueryUserInfoList() {// Setupfinal UserInfo userInfo = new UserInfo();userInfo.setId(0);userInfo.setUserName("userName");userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());final List<UserInfo> expectedResult = Arrays.asList(userInfo);// Configure UserInfoMapper.queryListByIds(...).final UserInfo userInfo1 = new UserInfo();userInfo1.setId(0);userInfo1.setUserName("userName");userInfo1.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());userInfo1.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());final List<UserInfo> userInfos = Arrays.asList(userInfo1);when(mockUserInfoMapper.queryListByIds("createTime", Arrays.asList(0))).thenReturn(userInfos);// Run the testfinal List<UserInfo> result = userInfoServiceImplUnderTest.queryUserInfoList("createTime", Arrays.asList(0));// Verify the resultsassertThat(result).isEqualTo(expectedResult);}@Testpublic void testQueryUserInfoList_UserInfoMapperReturnsNoItems() {// Setupwhen(mockUserInfoMapper.queryListByIds("createTime", Arrays.asList(0))).thenReturn(Collections.emptyList());// Run the testfinal List<UserInfo> result = userInfoServiceImplUnderTest.queryUserInfoList("createTime", Arrays.asList(0));// Verify the resultsassertThat(result).isEqualTo(Collections.emptyList());}

原始方法:Controller层,MockMvc

mockMvc.perform(request):执行一个HTTP请求,并返回ResultActions对象。
ResultActions.andExpect(expected):验证请求的处理结果,如状态码、响应体等。
ResultActions.andDo(handler):处理请求的响应,如将响应体写入文件等。
ResultActions.andReturn():返回已执行请求的结果,以便直接访问结果。
MockMvc.perform(request).andExpect(expected).andDo(handler).andReturn():链式调用,执行请求、验证结果并处理响应,返回结果。


@Slf4j
@RestController
public class UserInfoController {@Autowiredprivate UserInfoService userInfoService;/*** 查询全部列表* @return*/@RequestMapping("/boot/query/users")public List<UserInfo> getUserInfoList(){List<UserInfo> list = userInfoService.list();return list;}/*** 保存用户信息* @return*/@RequestMapping("/boot/save/user")public String saveUser(){try {UserInfo user=new UserInfo();user.setUserName("MyBatis Log Free");userInfoService.save(user);} catch (Exception e) {log.error("save user error", e);throw new GlobalException("save user error");}return "success";}@RequestMapping("/boot/query/users/ids")public List<UserInfo> getUserInfoListIds(){List<Integer> list = Arrays.asList(1, 3, 5);String createTime="2022-09-05 15:11:21";List<UserInfo> userInfos = userInfoService.queryUserInfoList(createTime,list);return userInfos;}@RequestMapping("/boot/query/users/like")public List<UserInfo> getUserInfoListLike(){List<UserInfo> infoList = userInfoService.queryListByUserName("A");return infoList;}@RequestMapping("/boot/save/userinfo")public void saveUserInfo(){UserInfo userInfo = new UserInfo();userInfo.setId(5);userInfo.setUserName("Puck");Date startTime = new Date();Date endTime = new Date();userInfo.setCreateTime(startTime);userInfo.setUpdateTime(endTime);userInfoService.saveUser(userInfo);}
}

 单元测试方法如下:

@RunWith(SpringRunner.class)
@WebMvcTest(UserInfoController.class)
public class UserInfoControllerTest {@Autowiredprivate MockMvc mockMvc;@MockBeanprivate UserInfoService mockUserInfoService;@Testpublic void testGetUserInfoList() throws Exception {// Setup// Configure UserInfoService.list(...).final UserInfo userInfo = new UserInfo();userInfo.setId(0);userInfo.setUserName("MyBatis Log Free");userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());final List<UserInfo> userInfos = Arrays.asList(userInfo);when(mockUserInfoService.list()).thenReturn(userInfos);// Run the testfinal MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users").accept(MediaType.APPLICATION_JSON)).andReturn().getResponse();// Verify the resultsassertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
//        assertThat(response.getContentAsString()).isEqualTo("expectedResponse");}@Testpublic void testGetUserInfoList_UserInfoServiceReturnsNoItems() throws Exception {// Setupwhen(mockUserInfoService.list()).thenReturn(Collections.emptyList());// Run the testfinal MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users").accept(MediaType.APPLICATION_JSON)).andReturn().getResponse();// Verify the resultsassertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());assertThat(response.getContentAsString()).isEqualTo("[]");}@Testpublic void testSaveUser() throws Exception {// Setupwhen(mockUserInfoService.save(new UserInfo())).thenReturn(false);// Run the testfinal MockHttpServletResponse response = mockMvc.perform(get("/boot/save/user").accept(MediaType.APPLICATION_JSON)).andReturn().getResponse();// Verify the resultsassertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());assertThat(response.getContentAsString()).isEqualTo("expectedResponse");verify(mockUserInfoService).save(new UserInfo());}@Testpublic void testGetUserInfoListIds() throws Exception {// Setup// Configure UserInfoService.queryUserInfoList(...).final UserInfo userInfo = new UserInfo();userInfo.setId(0);userInfo.setUserName("MyBatis Log Free");userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());final List<UserInfo> userInfos = Arrays.asList(userInfo);when(mockUserInfoService.queryUserInfoList("2022-09-05 15:11:21", Arrays.asList(0))).thenReturn(userInfos);// Run the testfinal MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users/ids").accept(MediaType.APPLICATION_JSON)).andReturn().getResponse();// Verify the resultsassertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());assertThat(response.getContentAsString()).isEqualTo("expectedResponse");}@Testpublic void testGetUserInfoListIds_UserInfoServiceReturnsNoItems() throws Exception {// Setupwhen(mockUserInfoService.queryUserInfoList("2022-09-05 15:11:21", Arrays.asList(0))).thenReturn(Collections.emptyList());// Run the testfinal MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users/ids").accept(MediaType.APPLICATION_JSON)).andReturn().getResponse();// Verify the resultsassertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());assertThat(response.getContentAsString()).isEqualTo("[]");}@Testpublic void testGetUserInfoListLike() throws Exception {// Setup// Configure UserInfoService.queryListByUserName(...).final UserInfo userInfo = new UserInfo();userInfo.setId(0);userInfo.setUserName("MyBatis Log Free");userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());final List<UserInfo> userInfos = Arrays.asList(userInfo);when(mockUserInfoService.queryListByUserName("A")).thenReturn(userInfos);// Run the testfinal MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users/like").accept(MediaType.APPLICATION_JSON)).andReturn().getResponse();// Verify the resultsassertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());assertThat(response.getContentAsString()).isEqualTo("expectedResponse");}@Testpublic void testGetUserInfoListLike_UserInfoServiceReturnsNoItems() throws Exception {// Setupwhen(mockUserInfoService.queryListByUserName("A")).thenReturn(Collections.emptyList());// Run the testfinal MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users/like").accept(MediaType.APPLICATION_JSON)).andReturn().getResponse();// Verify the resultsassertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());assertThat(response.getContentAsString()).isEqualTo("[]");}@Testpublic void testSaveUserInfo() throws Exception {// Setup// Run the testfinal MockHttpServletResponse response = mockMvc.perform(get("/boot/save/userinfo").accept(MediaType.APPLICATION_JSON)).andReturn().getResponse();// Verify the resultsassertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());assertThat(response.getContentAsString()).isEqualTo("expectedResponse");verify(mockUserInfoService).saveUser(new UserInfo());}
}

 @Mock用于模拟不属于 Spring 上下文的对象,而@MockBean用于模拟属于 Spring Boot 应用程序中的 Spring 上下文的对象。@MockBean提供与 Spring Boot 测试框架的无缝集成,并允许在测试期间用模拟对象轻松替换实际 bean 

Mockito提供了多种参数匹配器(Matchers)用于更灵活的验证和配置行为:

import static org.mockito.ArgumentMatchers.*;
when(mockRepository.findById(anyInt())).thenReturn(Optional.of(user));
verify(mockRepository).findById(eq(1));

常见的匹配器包括:

  ·any():匹配任何参数

  · anyInt():匹配任何整数参数

  · eq(value):匹配特定值

  · isNull():匹配null值

  · notNull():匹配非null值

Mock异常

Mockito.when(userMapper.getUserById(Mockito.anyInt())).thenThrow(new RuntimeException("运行时错误"));Assertions.assertThrowsExactly(RuntimeException.class, () -> userMapper.getUserById(1));// 对于没有返回值的方法,不能使用thenThrow()来抛出异常,可以使用doThrow()来抛出异常。
Mockito.doThrow(new RuntimeException("运行时错误")).when(userMapper).getUserById(1);
Assertions.assertThrowsExactly(RuntimeException.class, () -> userMapper.getUserById(1));

@MockBean 是 Spring Boot 提供的注解,它用于在测试中创建一个 mock 对象,并将其注入到 Spring 上下文中,替换掉原来的真实 Bean。 需要使用SpringJUnit4ClassRunner.class之类的注解

@Mock: 用于代替Mockito.mock创建mock对象,创建一个Mock实例,需要基于JUnit5环境。@InjectMocks: 创建一个实例,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。

你要测试哪个类(如TemplateUserServiceImpl ),那么就用 @InjectMocks注解;被测试的类中通过 @Autowired注解注入了几个,那么测试类里面就用@Mock注解创建几个实例!

原始代码:

@Service
public class TemplateUserServiceImpl implements TemplateUserService {@Autowiredprivate NamedParameterJdbcTemplate jdbcTemplate;@Transactional@Overridepublic void saveUser() {UserInfo userInfo = new UserInfo();userInfo.setId(7);userInfo.setUserName("Boot");Date startTime = new Date();Date endTime = new Date();userInfo.setCreateTime(startTime);userInfo.setUpdateTime(endTime);// JdbcTemplate的写入datetime,使用in方式
//        String sql="insert into user_info(user_name,create_time,update_time) values(:user_name,:create_time,:update_time)";String sql="insert into user_info(user_name,create_time,update_time) values(:userName,:createTime,:updateTime)";SqlParameterSource sqlParameterSource=new BeanPropertySqlParameterSource(userInfo);
//        HashMap paramMap = new HashMap<>();
//        paramMap.put("user_name",userInfo.getUserName());
//        paramMap.put("create_time",userInfo.getCreateTime());
//        paramMap.put("update_time",userInfo.getUpdateTime());
//        jdbcTemplate.update(sql,paramMap);jdbcTemplate.update(sql,sqlParameterSource);}
}

 对应单元测试代码:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;@RunWith(MockitoJUnitRunner.class)
public class TemplateUserServiceImplTest {@Mockprivate NamedParameterJdbcTemplate mockJdbcTemplate;@InjectMocksprivate TemplateUserServiceImpl templateUserServiceImplUnderTest;@Testpublic void testSaveUser() {// Setup// Run the testtemplateUserServiceImplUnderTest.saveUser();// Verify the resultsverify(mockJdbcTemplate).update(eq("insert into user_info(user_name,create_time,update_time) values(:userName,:createTime,:updateTime)"),any(SqlParameterSource.class));}@Testpublic void testSaveUser_NamedParameterJdbcTemplateThrowsDataAccessException() {// Setupwhen(mockJdbcTemplate.update(eq("insert into user_info(user_name,create_time,update_time) values(:userName,:createTime,:updateTime)"),any(SqlParameterSource.class))).thenThrow(DataAccessException.class);// Run the testassertThatThrownBy(() -> templateUserServiceImplUnderTest.saveUser()).isInstanceOf(DataAccessException.class);}
}

@MockBean 和 @SpyBean和@Spy以及@Mock的使用场景和区别 

 

五、单元测试生成插件

1、IDEA中安装Squaretest插件使用

文件右键即可生成对应单元测试,需要修改测试用例,满足业务诉求。

 

2、破解插件过程 

idea版本:

下载字节码编译工具:jclasslib。

jclasslib下载地址 

JAR包路径:C:\Users\Administrator\AppData\Roaming\JetBrains\IntelliJIdea2023.3\plugins\Squaretest 

 说明:不用版本的Squaretest插件的jar包名称或许不一样,找空间最大的那个,约15M左右的那个。

最后一步点击保存按钮,选择“overwrite”时,此时一定要将idea关闭,否则会保存失败的. 

最后破解成功,可以正常使用。

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

左神算法基础提升--3

文章目录 Manacher 算法经典算法Manacher算法原理 单调栈或单调队列 Manacher 算法 经典算法 在每学习Manacher算法之前我们可能会使用一种比较经典暴力的算法&#xff1a;遍历str字符串&#xff0c;将字符串中的每个字符作为对称点&#xff0c;向两边扩散找到回文字段&#x…

Android系统开发(八):从麦克风到扬声器,音频HAL框架的奇妙之旅

引言&#xff1a;音浪太强&#xff0c;我稳如老 HAL&#xff01; 如果有一天你的耳机里传来的不是《咱们屯里人》&#xff0c;而是金属碰撞般的杂音&#xff0c;那你可能已经感受到了 Android 音频硬件抽象层 (HAL) 出问题的后果&#xff01;在 Android 音频架构中&#xff0c…

OA-CNN:用于 3D 语义分割的全自适应稀疏 CNN

大家读完觉得有帮助记得及时关注和点赞&#xff01;&#xff01;&#xff01; 1介绍 2相关工作 基于点的学习。 基于 CNN 的学习。 动态卷积。 3全能自适应 3D 稀疏 CNN 3.1空间适应性感受野 赋予动机。 体素网格。 金字塔网格分区。 Adaptive 聚合器。 3.2自适应关…

聊聊如何实现Android 放大镜效果

一、前言 很久没有更新Android 原生技术内容了&#xff0c;前些年一直在做跨端方向开发&#xff0c;最近换工作用重新回到原生技术&#xff0c;又回到了熟悉但有些生疏的环境&#xff0c;真是感慨万分。 近期也是因为准备做地图交互相关的需求&#xff0c;功能非常复杂&#x…

Linux 操作二:文件映射与文件状态

Linux 操作二&#xff1a;文件映射与文件状态查询 文件映射 ​ mmap是一种内存映射文件的方法&#xff0c;即将一个文件或者其它对象映射到进程的地址空间&#xff0c;实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后&#xff0c;进程…

论文阅读:CosAE Learnable Fourier Series for Image Restoration

这是 2024 NeurIPS 上发表的一篇文章&#xff0c;介绍了一种新型的基于傅里叶级数的通用编码器。 Abstract 本文介绍了余弦自动编码器&#xff08;Cosine Autoencoder, CosAE&#xff09;&#xff0c;这是一种新颖的通用自动编码器&#xff0c;它将经典傅里叶级数与前馈神经网…

数据库服务体系结构

1. 数据库服务应用配置 服务进行配置有什么作用&#xff1f; 实现服务运行启动 实现某些功能 应用配置有三种方式&#xff1f; 利用编译安装进行配置 编写配置文件信息 ,.默认的配置文件: /etc/my.cnf 利用启动命令参数配置信息&#xff0c;mysqld_safe --skip-grant-tables --…

Armv8/Armv9架构从入门到精通-介绍

CSDN学院课程连接&#xff1a;https://edu.csdn.net/course/detail/39573 1 讲师介绍 拥有 12 年手机安全、汽车安全、芯片安全开发经验&#xff0c;擅长 Trustzone/TEE/ 安全的设计与开发&#xff0c;对 ARM 架构的安全领域有着深入的研究和丰富的实践经验&#xff0c;能够…

【Web】2025西湖论剑·中国杭州网络安全安全技能大赛题解(全)

目录 Rank-l Rank-U sqli or not Rank-l username存在报错回显&#xff0c;发现可以打SSTI 本地起一个服务&#xff0c;折半查找fuzz黑名单&#xff0c;不断扔给fenjing去迭代改payload from flask import Flask, request, render_template_stringapp Flask(__name__)app…

2025.1.17——三、SQLi regexp正则表达式|

题目来源&#xff1a;buuctf [NCTF2019]SQLi1 目录 一、打开靶机&#xff0c;整理信息 二、解题思路 step 1&#xff1a;正常注入 step 2&#xff1a;弄清关键字黑名单 1.目录扫描 2.bp爆破 step 3&#xff1a;根据过滤名单构造payload step 4&#xff1a;regexp正则注…

使用 Java 开发 Android 应用:Kotlin 与 Java 的混合编程

使用 Java 开发 Android 应用&#xff1a;Kotlin 与 Java 的混合编程 在开发 Android 应用程序时&#xff0c;我们通常可以选择使用 Java 或 Kotlin 作为主要的编程语言。然而&#xff0c;有些开发者可能会想要在同一个项目中同时使用这两种语言&#xff0c;这就是所谓的混合编…

【机器学习实战中阶】音乐流派分类-自动化分类不同音乐风格

音乐流派分类 – 自动化分类不同音乐风格 在本教程中,我们将开发一个深度学习项目,用于自动化地从音频文件中分类不同的音乐流派。我们将使用音频文件的频率域和时间域低级特征来分类这些音频文件。 对于这个项目,我们需要一个具有相似大小和相似频率范围的音频曲目数据集…

【C++】面试题整理(未完待续)

【C】面试题整理 文章目录 一、概述二、C基础2.1 - 指针在 32 位和 64 位系统中的长度2.2 - 数组和指针2.3 - 结构体对齐补齐2.4 - 头文件包含2.5 - 堆和栈的区别2.6 - 宏函数比较两个数值的大小2.7 - 冒泡排序2.8 - 菱形继承的内存布局2.9 - 继承重写2.10 - 如何禁止类在栈上分…

简历_使用 Redis 解决集群模式下的 Session 共享问题,使用拦截器实现用户的登录,校验和权限刷新以及对单位时间内请求频繁的用户IP地址进行限流。

系列博客目录 文章目录 系列博客目录1.使用 Redis 解决集群模式下的 Session 共享问题集群的session共享问题总结 2.使用拦截器实现用户的登录&#xff0c;校验和权限刷新3.对单位时间内请求频繁的用户IP地址进行限流。实现思路步骤&#xff1a;1. 添加 Redis 依赖2. 配置 Redi…

构建安全防线:基于视频AI的煤矿管理系统架构创新成果展示

前言 本文我将介绍一款AI产品的成果展示——“基于视频AI识别技术的煤矿安全生产管理系统”。这款产品是目前我在创业阶段和几位矿业大学的博士共同从架构设计、开发到交付的全过程中首次在博客频道发布, 我之前一直想写但没有机会来整理这套系统的架构, 因此我也特别感谢CSDN平…

浅谈计算机网络04 | 现代网络需求与技术支撑

现代网络需求与技术支撑 一、网络和因特网流量的类型剖析1.1 弹性流量的自适应特征1.2 非弹性流量的刚性特征1.3 实时流量特性 二、特定领域的网络需求解析2.1 大数据环境下的网络需求分析2.2 云计算环境下的网络需求分析2.3 移动数据环境下的网络需求分析 三、QoS和QoE&#x…

麒麟操作系统服务架构保姆级教程(十一)https配置

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 在运维工作中&#xff0c;加密和安全的作用是十分重要的&#xff0c;如果仅仅用http协议来对外展示我们的网站&#xff0c;过一段时间就会发现网站首页被人奇奇怪怪的篡改了&#xff0c;本来好好的博…

考研计算机组成原理——零基础学习的笔记

第一章 研究计算机硬件的学科。 1.计算机系统概述 计算机系统硬件软件&#xff08;系统软件&#xff1a;比如操作系统、数据库管理系统、标准程序库等&#xff0c;应用软件&#xff1a;QQ等&#xff09; 1.2计算机的层次结构 1.2.1计算机硬件的基本组成 冯诺伊曼计算机&a…

利用 LNMP 实现 WordPress 站点搭建

部署MySQL数据库 在主机192.168.138.139主机部署数据库服务 包安装数据库 apt-get install mysql-server 创建wordpress数据库和用户并授权 mysql> create database wordpress;#MySQL8.0要求指定插件 mysql> create user wordpress192.168.138.% identified with mys…

通过idea创建的springmvc工程需要的配置

在创建的spring mvc工程中&#xff0c;使用idea开发之前需要配置文件包括porm.xml、web.xml、springmvc.xml 1、porm.xml 工程以来的spring库&#xff0c;主要包括spring-aop、spring-web、spring-webmvc&#xff0c;示例配置如下&#xff1a; <project xmlns"http:/…