当前位置:网站首页>基于Junit4的单元测试
基于Junit4的单元测试
2022-06-10 11:03:00 【andQVQ】
文章目录
测试类基本思路
- mock中引入测试类。
- 初始化类中的对象和引用类,建立映射关系。
- 构建需要测试的数据和请求,测试功能是否运行正确。
测试顺序
@Test:这个注释说明依附在 JUnit 的 public void 方法可以作为一个测试案例。
@Before:有些测试在运行前需要创造几个相似的对象。在 public void 方法加该注释是因为该方法需要在 test 方法前运行。
@After:如果你将外部资源在 Before 方法中分配,那么你需要在测试运行后释放他们。在 public void 方法加该注释是因为该方法需要在 test 方法后运行。
@BeforeClass:在 public void 方法加该注释是因为该方法需要在类中所有方法前运行。
@AfterClass:它将会使方法在所有测试结束后执行。这个可以用来进行清理活动。
@Ignore:这个注释是用来忽略有关不需要执行的测试的。
在 before() 方法和 after() 方法之间,执行每一个测试用例。
@RunWith(SpringRunner.class)
测试类的初始化。在测试类的开头标注,表明运行环境,例如启动和创建spring的应用上下文。否则你需要为此在启动时写一堆的环境配置代码。
@Mock:
在单元测试中,我们往往想去独立地去测一个类中的某个方法,但是这个类可不是独立的,它会去调用一些其它类的方法和service,这也就导致了以下两个问题:
- 外部服务可能无法在单元测试的环境中正常工作,因为它们可能需要访问数据库或者调用其它Http服务。
- 我们的测试关注点在于这个类的实现上,外部类的一些行为可能会影响到我们对本类的测试,那也就失去了我们进行单测的意义。
在Mockito中用于创建mock对象,使用方法如下:
@Mock
private ClassName mockedObject;
上面代码创建了一个名为mockedObject,类型为ClassName的mock对象,该对象所有的方法被置空,根据测试代码逻辑的需要使用
MockitoAnnotations.initMocks(this);
让@Nock注解生效
Mock方法的默认值
Mock对象的方法未设置测试桩时,Mockito会返回方法返回类型的默认值,不会报错。mock 实例默认的会给所有的方法添加基本实现:返回 null 或空集合,或者 0 等基本类型的值。这取决于方法返回类型
List mockList = mock(List.class);
when(mockList.get(5)).thenReturn("hello");//打桩
Assert.assertEquals("hello", mockList.get(5));//打桩的情景返回设定值
Assert.assertEquals(null, mockList.get(10));//未打桩的情景不会报错,返回默认值
参数匹配器(matchers)
属于状态测试
是一些静态方法,说白了就是mock方法成立的一些条件
列举几个典型匹配器:
any() : 任何参数
any(OrderInfo.class): 任何OrderInfo(开发中自定义的类)
anyString() :任何字符串,等同于any(String.class)
eq(1): 具体值1
InvokeService类中,要被mock的方法
public Integer targetMethod01(String param01, Integer param02) {
return 1;
}
测试类TargetClassTest中:
@Mock
private InvokeService mockService;
@Test
public void dmeoTest() {
Mockito.when(mockService.targetMethod01(any(), any())).thenReturn(666);
Mockito.when(mockService.targetMethod01(any(String.class), anyInt())).thenReturn(666);
Mockito.when(mockService.targetMethod01("demo", 1)).thenReturn(666);
Mockito.when(mockService.targetMethod01(eq("demo"), eq(1))).thenReturn(666);
//上面都是正确的,下面的写法,单测执行时会报错
Mockito.when(mockService.targetMethod01(eq("demo"), 1)).thenReturn(666);
}
一旦使用了参数匹配器来验证,那么所有参数都应该使用参数匹配
行为测试
某些时候,测试不关心返回结果,而是侧重方法有否被正确的参数调用过。从概念上讲,就是和状态测试所不同的“行为测试”了。
一旦使用 mock() 或@Mock生成模拟对象,意味着 Mockito 会记录着这个模拟对象调用了什么方法,还有调用了多少次、调用的顺序等。最后由用户决定是否需要进行验证。
times(x):mock方法被调用x次
never():从未被调用过,等价于times(0)
atLeast(x):至少调用过x次
atLeastOnce():至少调用过1次,等价于atLeast(1)
atMost(x):最多调用过x次
verify():内部跟踪了所有的方法调用和参数的调用情况,然后会返回一个结果,说明是否通过。也可以像 when 那样使用参数匹配器。
field
判断类中是否包含某个字段
RefelctionUtils.findFiled(class, name);
使 filed 变为可访问
ReflectionUtils.makeAccessible(field);
直接设置对象属性值
ReflectionUtils.setFiled(Field field, Object target, Object value);
Assert
assert意为断言的意思,这个关键字可以判断布尔值的结果是否和预期的一样,如果一样就正常执行,否则会抛出AssertionError。
void assertEquals(boolean expected, boolean actual):检查两个变量或者等式是否平衡
void assertTrue(boolean expected, boolean actual):检查条件为真
void assertFalse(boolean condition):检查条件为假
void assertNotNull(Object object):检查对象不为空
void assertNull(Object object):检查对象为空
void assertSame(boolean condition):assertSame() 方法检查两个相关对象是否指向同一个对象
void assertNotSame(boolean condition):assertNotSame() 方法检查两个相关对象是否不指向同一个对象
void assertArrayEquals(expectedArray, resultArray):assertArrayEquals() 方法检查两个数组是否相等
JUnit 时间测试
如果一个测试用例比起指定的毫秒数花费了更多的时间,那么 Junit 将自动将它标记为失败。timeout参数和 @Test 注释一起使用。是不是很强大?
@Test(timeout=1000)
JUnit 参数化测试
Junit 4 引入了一个新的功能参数化测试。参数化测试允许开发人员使用不同的值反复运行同一个测试。你将遵循 5 个步骤来创建参数化测试。
- 用 @RunWith(Parameterized.class) 来注释 test 类。
- 创建一个由 @Parameters注释的公共的静态方法,它返回一个对象的集合(数组)来作为测试数据集合。
- 创建一个公共的构造函数,它接受和一行测试数据相等同的东西。
- 为每一列测试数据创建一个实例变量。
- 用实例变量作为测试数据的来源来创建你的测试用例。
一旦每一行数据出现测试用例将被调用。
边栏推荐
- Yutai semiconductor rushes to the scientific innovation board: the annual revenue is 830million, and the actual controller is American
- 你的下一台电脑何必是电脑,探索不一样的远程操作
- 第 1 天 栈与队列(简单)
- 【黄啊码】老师,高考后我想选软件开发相关专业,你觉得选哪个方向好?高考志愿怎么填报?
- 纪念正月十六工作室总访问量突破百万
- 杰理之BLE 动态调节功率【篇】
- Modstartcms enterprise content site building system (supporting laravel9) v4.1.0
- golang线程安全的本地map -- gocache
- 中台:数据中台、业务中台、技术中台、应用中台、AI中台……
- Software testing quality and assurance
猜你喜欢

RT thread usage manual (updated on 2022-0516)

中台:数据中台、业务中台、技术中台、应用中台、AI中台……

Conversion between binary, octal, decimal and hexadecimal (integer plus decimal)

MIT6.824-lab2D-2022(日志压缩详细讲解)

杰理之BLE IO 口中断及翻转【篇】

杰理之BLE timer 时钟源不能选 OSC 晶振【篇】

Nucleic acid detection robot

杰理之长按复位及高电平复位【篇】

珠海高远电能科技有限公司30%股权转让,来自塔米狗分享

Meetup回顾|DevOps&MLOps如何在企业中解决机器学习困境?
随机推荐
剑指位运算
Niuke Mianjing 02
Switch the Taobao image of NPM
[first hpm6750 evaluation] RT thread development environment construction and hello world
Sword finger position operation
Use matlab to generate COE files of sine wave, triangular wave and square wave
基于昇腾AI异构计算架构CANN的通用目标检测与识别一站式方案初体验
cocoslua在vs2013的调试方法
Fundamentals of software testing
[untitled]
Sublime text - 01 code tracking
Kubernetes setting master schedulable and non schedulable
渡远户外冲刺深交所:年营收3.5亿 林锡臻家族色彩明显
fragment实现底部导航栏不刷新切换
What is the difference between NoClassDefFoundError and classnotfoundexception
关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
钰泰半导体冲刺科创板:年营收8.3亿 实控人为美国籍
golang线程安全的本地map -- gocache
Is the online account opening channel reliable? Is it safe?
Vite's public directory