Mockito基础使用
What’s Mockito ?Mockito是Java单元测试开发框架。在写测试单元时它可以Mock(模拟)开发中一些未完成的接口或者网络断开、数据库连接错误等方法调用。Mockito很强大文中有限还有很多使用方式未提及,请参考官方文档。官方文档链接在文章尾部给出。eq:when() 多个参数或者搭配List根据不同index设置返回结果。
QuickStart为了更好的表达使用一个Mock DAO层的场景,数据库还没能正常使用时但是又急需测试功能逻辑是否正确。
123456mapper---| UserMapper.javamapperImpl---| UserMapperImpl.javaservice---| UserService.java
12345678//UserMapper.javapublic interface UserMapper{ User selectOne(Integer id); void print();}
1234567891011public class UserMapp ...
2021年总结
阅读此短文时,假设你听着《安静的午后》。
其实我不擅长总结和写作,只是有些感悟想记录一些东西。常常在走路或乘坐地铁的时候思考一些问题,也常常忘记。只是回忆里持久存储了平衡这个关键字,现实与梦想,工作与爱好等等很多方面都涉及这个词。
一直想寻找它们的平衡点。
2021年4月来到了深圳,开始新的生活,新的工作。这一年来爬了许多山,喜欢爬山原因,不是因为喜欢登高望远,而是喜欢和朋友在一起的感觉。
真诚、勇敢都在他们身上体现到,很值得我去学习。
这一年我的关键词:焦虑、忙碌。(挺符合现代青年)
2021年阅读过的书籍 《如何阅读一本书》、《人性的弱点》、《CS:APP》 、《My SQL技术内幕》、《Redis设计与实现》、 《代码整洁之道》。
不知道什么时候进入了一个怪圈,总是绕在里面死循环,越学习越焦虑,焦虑就想学习。可能自己之前一直功利性阅读,功利性阅读会造成阅读厌倦,总想快速阅读完整本书然后参加各种考试和面试,无法从中体会到作者的伟大的智慧,只是为了需要阅读而阅读。
其实到这脑子已经空白了。
这一年不是在加班就是在加班路上,被迫性学习确实让我成长很快,学习中更向往的是系 ...
深入理解前后置自增
简单认识寄存器
寄存器是最靠近CPU的存储器有着更快读写速度,相当于内存的Cache。(Mysql与Redis的感觉)
计算机存储器读写速度比较:寄存器>主存储器(内存)>硬盘。CPU从寄存器读取速度比从内存读取快百倍甚至千倍的速度,当然越快存储空间越小,所以通常会把比较小的数据从内存复制到寄存器计算。
本文只用到3个寄存器其他寄存器不过多介绍,读者可以网上自主查询。此文的位指的是比特位寄存器可以理解为一个数组,%rax是整个64位长度的数组,而%eax是%rax数组里的32位的数组。
名称为%rax是比较特殊的寄存器,用于存储函数返回值,这源于寄存器使用规范它们与其他整数寄存器没差异。
长度64位 位置64至0
长度32位 位置0至31
长度16位 位置0至15
长度8位 位置0至7
作用
%rax
%eax
%ax
%al
存储返回值
%rdx
%edx
%dx
%dl
存储值
%rbp
%esp
%bp
%bpl
存储栈指针
使用寄存器汇编指令汇编指令与机器代码非常接近的表示。与机器码的二进制格式相比,汇编代码的主要特点是它 ...
2020个人年终总结
回顾2020
这篇文章是我改写的第N次,之前主要以批判自我与社会的角度去总结2020,但是为了体现乐观我选择藏在心里。
0202年实在太魔幻了,加上👴年纪大了把很多无关重要的事情就谈忘了主要就记得以下几件比较乐观的事情。
博客庆生🎉好了 截止2020年6月我的博客已经一周年了 ,这一年来主要走的技术方向为JavaWeb(编译原理的文章待出),发现自己好Vegetable 基础一直没打好,很多概念需要大佬解释帮助+查资料才能算是弄明白。
刚开始写的文章没有配上好看的配图,后来参考了大佬们的文案+图片素材制作风格,现在写出来的文章风格整体看起来还算看得过去。
毕业了🏫2020年7月 我们毕业了,学生时代很是美好。一场小聚小饮我们就散了。
2019年12月27日定下的目标 ✨
希望自己(国家要消除贫穷)没被国家消灭
把《Spring 实战4》、《大话数据结构》《自己动手写编译器》看完
100斤
完成个人博客(Java开发)
骑行西藏
算是完成60% ,《自己动手写编译器》就暂时停下来了因为书本内容属实晦涩难懂已经触及到我的知识盲区了。从112斤减到104的时候又开始忙别的了始 ...
Java并发编程-内存模型
内存模型内存模型是程序的运行规则,用于观察程序读写内存操作是否合法。Java内存模型的出现是用于屏蔽各种硬件和操作系统的内存访问差异手段,实现让Java程序在各种平台下都能达到一致的内存访问效果。
在《Java虚拟机规范》中对Java堆的描述是:“所有的对象实例以及数组都应当在堆上分配”,并且被线程共享。方法区跟堆一样是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量。
局部变量,方法定义参数和异常处理程序参数不会被线程之间共享,它们不会受到内存模型的影响。
下方图是CPU组织与Java内存模型,它们很处理并发的情况有很多相似之处。推荐阅读文章Java并发编程-CPU缓存知识
内存模型的工作内存保存的是(堆/方法)的数据副本可以理解工作内存为栈,线程对变量的所有操作(读取、赋值等)都必须在工作内。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主存储器(堆/方法区)来完成。
图上的(堆/方法区)其实对应的是主存储器,工作内存对应的是高速缓存,只是为了更加看起来感观,虚拟机为了获取到更好的运行速度会可能会让工作内存优先存储于寄存器 ...
Java并发编程-CPU缓存知识
基础知识首先了解程序在系统硬件组织是如何运行,如下方图这是一张Intel系统产品族的模型它和所有其它系统有相似的共同特性。
编译完成的待执行的代码I/O桥会从硬盘读取复制到主存储器(内存)再通过I/O桥复制到CPU,CPU读取复制到的数据会放到寄存器通过ALU(逻辑单元运算器)计算完成返回到寄存器,再由I/O桥把结果返回到主存储器或其它组件。
高速缓存的至关重要根据机械原理,较大的存储设备要比较小的存储设备运行的慢,而快速设备的造价远高于同类低速设备。比如说,硬盘比主存储器大1000倍,但是对处理器而言,从硬盘上读取一个字的时间开销要比主存储器的读取开销1000万倍。
随着这些年半导体技术进步,处理器与主存的之间的速度差距增大,为了解决系统通信的速度差距所以处理器引入了高速缓存(cache memory),作为暂时的集结区域,存放处理器近期可能会需要的信息。
多级缓存
现在的CPU多核技术,都会有多级缓存,老的CPU会有两级内存(L1和L2),新的CPU会有三级内存(L1,L2,L3 )
L1缓分成两种,一种是指令缓存,一种是数据缓存。L2缓存和L3缓存不分指令和数据。
L1和L ...
深入理解JVM 中
前言经过上一篇文章《深入理解JVM 上》的内容总结可以让自己知道JVM大致的运行原理,本章接下来介绍的是如何解析与加载类。
Class文件存储的是字节码是为了跨平台运行而设计,这种结构不仅仅是能存储Java语言,比如Kotlin也可以编译为Class文件虚拟机一样可以运行,虚拟机无需关心Class的来源是什么语言因为它更像一个独立的系统。
Class文件结构Class文件是一组以8个字节为基础单位的二进制流, 各个数据项目严格按照顺序紧凑地排列在文件之中, 中间没有添加任何分隔符, 这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据, 没有空隙存在。 当遇到需要占用8个字节以上空间的数据项时, 则会按照高位在前(高位字节在地址最低位,最低字节在地址最高位来存储数据 )的方式分割成若干个8个字节进行存储。 下方是代码对应编译好的Class文件的HEX,例如:HelloWorld.Class “0xCAFEBABE”四个字节的“魔数” (00~03),接着(04-07)Class主副版本号,这组8个字节是为了保证虚拟机识别文件而设计。
12345678//此源码使用的是 ...
深入理解JVM 上
什么是JVM?JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。(引用百度百科)
SunJDK和OpenJDK内置的是 HotSpot JVM,是目前使用范围最广的Java虚拟机,当然还有很多虚拟机也非常优秀比如 KVM、Squawk VM、IBM J9 VM等。
深入理解JVM不同的系统指令是不一样的如果只是把源码编译为专属的指令,那么只能在这个系统运行,如果想在另一个系统运行则需要重新编译的,Java为了达到一次编译到处运行的效果,选择的是源码编译成字节码而不是像C++直接编译为本地系统专属的指令,虚拟机就像一台计算机一样.class保存的就是虚拟机指令只要你的系统装上JVM就能不用再次编译源码就能直接运 ...
Java多线程应用基础
进程与线程
进程:是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
线程:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
每个程序都是一个进程,一个进程里面可以包含多个线程。(比如你在听歌的时候是一个线程,下载音乐又是另一个线程,它们不会互相干扰),线程之间可以共享进程的资源。
Java多线程
Java虚拟机允许应用程序同时执行多个执行线程。
1、继承ThreadThread常用的方法
Modifier and Type
Method
Description
void
start()
导致此线程开始执行; Java虚拟机调用此线程的run方法。
static void
sleep(long millis)
使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。 会占用线程的睡眠
void
join()
等待这个线程死亡。
static void
yield()
对调度程序的一个暗示,即当前线程愿意产生当前使用的处理器 ...