首页 > 编程语言 >Java中进行单元测试junit.Assert断言、Mockito模拟对象、verify验证模拟结果、Java8中lambda的peek方法使用

Java中进行单元测试junit.Assert断言、Mockito模拟对象、verify验证模拟结果、Java8中lambda的peek方法使用

时间:2023-02-07 10:37:38浏览次数:39  
标签:Object Java verify void object add Test public 模拟


场景

Java8新特性-Stream对集合进行操作的常用API:

​​Java8新特性-Stream对集合进行操作的常用API_霸道流氓气质的博客-博客_javalist.stream​​

在上面使用流操作时需要用到单元测试的情况。

在Junit单元测试方法中使用org.junit.Assert进行断言校验。

org.junit.Assert

常用方法如下

//    void assertEquals(Object object,Object object) 判断输入的参数值是否相等
//    void assertFalse(boolean condition) 判断输入参数是否为false
//    void assertTrue(boolean condition) 判断输入参数是否为true
//    void assertNotNull(Object object) 判断输入参数是否不为null
//    void assertNull(Object object) 判断输入参数是否为null
//    void assertSame(Object object,Object object) 判断引用对象是否相等(必须传入引用类型)
//    void assertNotSame(Object object,Object object) 判断引用对象是否不相等
//    assertEquals(double expected, double actual, double delta) 检查指定精度的double值是否相等(delta为可以波动的范围)

注:

​​ 关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

assertSame

@Test
public void test2(){
String expected = "badao";
String actucal = "badao";
assertSame(expected,actucal);
}

assertNotSame

@Test
public void test3(){
String expected = "badao";
String actucal = "badao";
assertNotSame(expected,actucal);
}

assertEquals

@Test
public void test4(){
int expected = 123;
int actucal = 123;
assertEquals(expected,actucal);
}

assertNotEquals

@Test
public void test5(){
int expected = 123;
int actucal = 123;
assertNotEquals(expected,actucal);
}

assertNull

@Test
public void test6(){
Object object = null;
assertNull(object);
}

assertNotNull

@Test
public void test7(){
Object object = null;
assertNotNull(object);
}

assertTrue

@Test
public void test8(){
assertTrue(1>2);
}

assertFalse

@Test
public void test9(){
assertFalse(1>2);
}

断言通过时

 

断言不通过时

 

Mockito

Mockito是mocking框架,它让你用简洁的API做测试。而且Mockito简单易学,它可读性强和验证语法简洁。

Mockito 是一个针对 Java 的单元测试模拟框架,它与 EasyMock 和 jMock 很相似,都是为了简化单元测试过程中测试

上下文 ( 或者称之为测试驱动函数以及桩函数 ) 的搭建而开发的工具。相对于 EasyMock 和 jMock,

Mockito 的优点是通过在执行后校验哪些函数已经被调用,消除了对期望行为(expectations)的需要。

其它的 mocking 库需要在执行前记录期望行为(expectations),而这导致了丑陋的初始化代码。

mock示例

1、mock一个Random随机数对象,并且设置当调用nextInt方法时,永远返回100

@Test
public void test1(){
Random mockRandom = mock(Random.class);
//指定调用nextInt方法时,永远返回100
when(mockRandom.nextInt()).thenReturn(100);
Assert.assertEquals(100,mockRandom.nextInt());
}


 

2、mock一个ArrayList

@Test
public void test10(){
ArrayList mockArrayList = mock(ArrayList.class);
//Assert.assertTrue(mockArrayList instanceof List);
when(mockArrayList.add(1)).thenReturn(true);
Assert.assertTrue(mockArrayList.add(1));
}

3、mock一个Iterator迭代器,并且设置当调用next方法时抛出空指针异常

@Test
public void test11(){
Iterator iterator = mock(Iterator.class);
when(iterator.next()).thenReturn("Hello");
//方法抛出异常
doThrow(new NullPointerException()).when(iterator).next();
iterator.next();
}


 

mock的verify方法

Mockito提供了verify()方法来验证这个mock实例的某个方法是否被调用,调用了几次,是否带有参数以及带有何种参数等

示例

@Test
public void test12(){
List mockedList = mock(List.class);
//Mockito提供了verify()方法来验证这个mock实例的某个方法是否被调用,调用了几次,是否带有参数以及带有何种参数等
mockedList.add("aa");
//验证方法执行过一次
verify(mockedList,atLeastOnce()).add("aa");
}

会验证mockedList是否至少执行过一次

其中atLeastOnce()是静态方法。

import static org.mockito.Mockito.*;

除了该方法还有

@Test
public void test12(){
List mockedList = mock(List.class);
//Mockito提供了verify()方法来验证这个mock实例的某个方法是否被调用,调用了几次,是否带有参数以及带有何种参数等
mockedList.add("aa");
//验证方法执行过一次
//verify(mockedList,atLeastOnce()).add("aa");
//验证执行次数,这里为2次
//verify(mockedList,times(2)).add("aa");
//最多调用一次
//verify(mockedList,atMostOnce()).add("bbb");
//对参数也会校验
verify(mockedList,never()).add("aa");//不通过
verify(mockedList,never()).add("aaa");//通过
}

比如这里的times(2)代表验证次数是否执行2次,如果期待2次,但是实际只执行一次,则会报错

 

不仅对方法,还会对方法参数进行校验,比如上面执行add("aa")一次之后,验证add("aa")与add("aaa")是不一样的。

Java8中流操作时进行调试--peek

假设你要在集合上进行大量操作,要调试代码,你希望看到每一步操作的步骤是什么。

可以在每一步打印出集合中的值,这在流中很难做到。

peek方法,能让你查看每个值,同时能继续操作流。

示例

1、简单示例

//不会有任何输出
@Test
public void test13() {
Stream.of("1","2","3")
.peek(s -> System.out.println(s));
}


 

2、对象list

//会对对象进行操作并输出
@Test
public void test14() {
Album album1 = Album.builder()
.albumName("album1")
.trackList(new ArrayList<Track>(){{
this.add(Track.builder().trackName("a").length(60f).build());
this.add(Track.builder().trackName("b").length(70f).build());
this.add(Track.builder().trackName("c").length(80f).build());
this.add(Track.builder().trackName("d").length(90f).build());
}})
.build();
album1.getTrackList().stream().peek(album ->{album.setTrackName("badao");}).forEach(System.out::println);
}


 

3、实际应用

//peek方法,能让你查看每个值,同时能继续操作流
@Test
public void test15() {
Album album1 = Album.builder()
.albumName("album1")
.trackList(new ArrayList<Track>(){{
this.add(Track.builder().trackName("a").length(60f).build());
this.add(Track.builder().trackName("b").length(70f).build());
this.add(Track.builder().trackName("c").length(80f).build());
this.add(Track.builder().trackName("d").length(90f).build());
}})
.build();
album1.getTrackList()
.stream()
//输出流中的值,同时避免了重复的流操作,不用再forEach,可用于输出定向到现有的日志系统中
.peek(album ->{
System.out.println(album.getTrackName()+"--"+album.getLength());})
.map(a->a.getTrackName())
.collect(Collectors.toList())
.forEach(System.out::println);
}


 

以上示例代码汇总

package com.ruoyi.demo.java8demo;

import com.ruoyi.demo.domain.Album;
import com.ruoyi.demo.domain.Track;
import org.junit.Assert;
import org.junit.Test;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

public class unitTestDemo {

// void assertEquals(Object object,Object object) 判断输入的参数值是否相等
// void assertFalse(boolean condition) 判断输入参数是否为false
// void assertTrue(boolean condition) 判断输入参数是否为true
// void assertNotNull(Object object) 判断输入参数是否不为null
// void assertNull(Object object) 判断输入参数是否为null
// void assertSame(Object object,Object object) 判断引用对象是否相等(必须传入引用类型)
// void assertNotSame(Object object,Object object) 判断引用对象是否不相等
// assertEquals(double expected, double actual, double delta) 检查指定精度的double值是否相等(delta为可以波动的范围)

@Test
public void test2(){
String expected = "badao";
String actucal = "badao";
assertSame(expected,actucal);
}

@Test
public void test3(){
String expected = "badao";
String actucal = "badao";
assertNotSame(expected,actucal);
}

@Test
public void test4(){
int expected = 123;
int actucal = 123;
assertEquals(expected,actucal);
}

@Test
public void test5(){
int expected = 123;
int actucal = 123;
assertNotEquals(expected,actucal);
}

@Test
public void test6(){
Object object = null;
assertNull(object);
}

@Test
public void test7(){
Object object = null;
assertNotNull(object);
}

@Test
public void test8(){
assertTrue(1>2);
}

@Test
public void test9(){
assertFalse(1>2);
}

@Test
public void test1(){
Random mockRandom = mock(Random.class);
//指定调用nextInt方法时,永远返回100
when(mockRandom.nextInt()).thenReturn(100);
Assert.assertEquals(100,mockRandom.nextInt());
}

@Test
public void test10(){
ArrayList mockArrayList = mock(ArrayList.class);
//Assert.assertTrue(mockArrayList instanceof List);
when(mockArrayList.add(1)).thenReturn(true);
Assert.assertTrue(mockArrayList.add(1));
}

@Test
public void test11(){
Iterator iterator = mock(Iterator.class);
when(iterator.next()).thenReturn("Hello");
//方法抛出异常
doThrow(new NullPointerException()).when(iterator).next();
iterator.next();
}

@Test
public void test12(){
List mockedList = mock(List.class);
//Mockito提供了verify()方法来验证这个mock实例的某个方法是否被调用,调用了几次,是否带有参数以及带有何种参数等
mockedList.add("aa");
//验证方法执行过一次
//verify(mockedList,atLeastOnce()).add("aa");
//验证执行次数,这里为2次
//verify(mockedList,times(2)).add("aa");
//最多调用一次
//verify(mockedList,atMostOnce()).add("bbb");
//对参数也会校验
verify(mockedList,never()).add("aa");//不通过
verify(mockedList,never()).add("aaa");//通过
}


//不会有任何输出
@Test
public void test13() {
Stream.of("1","2","3")
.peek(s -> System.out.println(s));
}

//会对对象进行操作并输出
@Test
public void test14() {
Album album1 = Album.builder()
.albumName("album1")
.trackList(new ArrayList<Track>(){{
this.add(Track.builder().trackName("a").length(60f).build());
this.add(Track.builder().trackName("b").length(70f).build());
this.add(Track.builder().trackName("c").length(80f).build());
this.add(Track.builder().trackName("d").length(90f).build());
}})
.build();
album1.getTrackList().stream().peek(album ->{album.setTrackName("badao");}).forEach(System.out::println);
}

//peek方法,能让你查看每个值,同时能继续操作流
@Test
public void test15() {
Album album1 = Album.builder()
.albumName("album1")
.trackList(new ArrayList<Track>(){{
this.add(Track.builder().trackName("a").length(60f).build());
this.add(Track.builder().trackName("b").length(70f).build());
this.add(Track.builder().trackName("c").length(80f).build());
this.add(Track.builder().trackName("d").length(90f).build());
}})
.build();
album1.getTrackList()
.stream()
//输出流中的值,同时避免了重复的流操作,不用再forEach,可用于输出定向到现有的日志系统中
.peek(album ->{
System.out.println(album.getTrackName()+"--"+album.getLength());})
.map(a->a.getTrackName())
.collect(Collectors.toList())
.forEach(System.out::println);
}
}

标签:Object,Java,verify,void,object,add,Test,public,模拟
From: https://blog.51cto.com/BADAOLIUMANGQZ/6041381

相关文章

  • QML教程(七) JavaScript
    目录一、对属性值使用JavaScript表达式二、在QML中添加JavaScript函数三、使用JavaScript文件四、属性绑定中的JavaScript五、信号处理程序中的JavaScript......
  • javaFX的几个新特性,让swing彻底过时
    首先声明,Java的GUI曾经是最弱的一环,毋庸置疑,而且历史上因为跟M$的斗争,导致Java失去了Desktop发展的最佳时间点,即便后来SUN&Oracle推出了JavaFX,Desktop......
  • QML概念及框架--继承JavaScript
    QML推荐使用属性绑定和现有的QML元素来创建界面。为了允许执行更高级的行为,QML紧密集成了必要的JavaScript代码。QML中提供的JavaScript环境比在网页浏览器中的更严格。在Q......
  • Java 图形验证码
    简介Java图形验证码,支持Gif、中文、算术等类型,可用于JavaWeb、JavaSE等项目。效果展   集成项目maven方式引入:<dependency><groupId>com.git......
  • java stream
    多字段mapMap<Integer,String>map=list.stream().collect(Collectors.toMap(Entity::getId,Entity::getType));//可改成Map<Integer,String>map=list.strea......
  • java.net.BindException: Cannot assign requested address
    这个错误如果从没见过,绝对会浪费大家好多时间去查找,而且网上千篇文章都没有一个真正的解决办法!欢迎请大家转载!!新服务器配置tomcat7.0环境,配置完毕后,......
  • JNI调用java中的类方法和静态方法
    在JNI调用中,肯定会涉及到本地方法操作Java类中数据和方法。在Java1.0中“原始的”Java到C的绑定中,程序员可以直接访问对象数据域。然而,直接方法要求虚......
  • java GZIPOutputStream,GZIPInputStream 用法
    GZIP常常用在linxu环境下,是一种非常简单的压缩算法。在Java实现API中,它仅仅包含两个实现类:GZIPInputStream和GZIPOutputStream。GZIPOutputStream类......
  • 掌握java枚举类型(enum type)
    1背景在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量。之前我们通常利用publicfinalstatic方法定义的代码如......
  • [java] JSON格式校验
    对JSON字符串进行格式校验,不依赖于第三方包packagecom.iaiai.test;importjava.text.CharacterIterator;importjava.text.StringCharacterIterator......