Junit+Mock单元测试
项目用的是maven,所需jar包在pom.xml文件里面配置,单元测试要用的jar具体如下:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>
从上面的jar包可以看到,这次主要用了Junit mock 和 spring-test.
具体的构建项目这里就不多说了,接下来我们直接看下testBean里面的具体代码应用:
具体类:
package com.lcc.parser; import com.lcc.dto.RatingTagFieldDto;
import com.lcc.rating.RatingTagField; import java.util.ArrayList;
import java.util.List; public final class RatingTagFieldDtoParser { public static List<RatingTagFieldDto> fromRatingTagFieldList(List<RatingTagField> ratingTagFieldList) {
if (ratingTagFieldList == null) {
return new ArrayList<>();
} List<RatingTagFieldDto> resultList = new ArrayList<>();
for (RatingTagField ratingTagField : ratingTagFieldList) {
RatingTagFieldDto ratingTagFieldDto = new RatingTagFieldDto();
ratingTagFieldDto.setId(ratingTagField.getId());
ratingTagFieldDto.setKey(ratingTagField.getKey()); resultList.add(ratingTagFieldDto);
}
return resultList;
} }
测试类:
package com.opentrans.otms.core.infrastructure.service.impl.xtt.rmi.parser; import com.lcc.dto.RatingTagFieldDto;
import com.lcc.rating.RatingTagField;
import com.opentrans.lcc.rating.RatingTagFieldRepository;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner; import java.util.ArrayList;
import java.util.List; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class)
public class RatingTagFieldDtoParserTest {
@Mock
private RatingTagFieldRepository ratingTagFieldRepository;
@Before
public void doBefore() {
List<RatingTagField> ratingTagFields = mockRatingTagField();
when(ratingTagFieldRepository.findActiveTags()).thenReturn(ratingTagFields);
}
@Test
public void testFromTatingTagFieldList() {
List<RatingTagField> ratingTagFields = ratingTagFieldRepository.findActiveTags();
List<RatingTagFieldDto> ratingTagFieldDtos = RatingTagFieldDtoParser.fromRatingTagFieldList(ratingTagFields);
RatingTagFieldDto ratingTagFieldDto = ratingTagFieldDtos.get(0);
Assert.assertEquals(ratingTagFieldDto.getId(), Long.valueOf(111));
Assert.assertEquals(ratingTagFieldDto.getKey(), "asdfghjkl");
}
private List<RatingTagField> mockRatingTagField() {
List<RatingTagField> ratingTagFields = new ArrayList<>();
RatingTagField ratingTagField = new RatingTagField();
ratingTagField.setId(111L);
ratingTagField.setKey("asdfghjkl");
ratingTagField.setActive(true);
ratingTagFields.add(ratingTagField);
return ratingTagFields;
}
}
上面的@RunWith注解我们还可以用springJunit4下面的class,只要我们的项目是支持spring的,就可以用
SpringJUnit4ClassRunner.class,但是如果我们用的是SpringJUnit4ClassRunner.class,就必须要加上@ContextConfiguration注解,指向xml文件;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("ConnectionEventMailTest-context.xml")
如果对mock不理解的可以去看一下官方文档;
关于MockitoJUnitRunner.class 和 SpringJUnit4ClassRunner.class 的区别:
Mock下面的类不与数据库进行数据交互,测试类里面的数据是我们纯mock出来的,
而spring下面的类是可以与数据库进行数据交互的,如果我们要进行数据交互就必须指向xml进行数据库连接。
这两个的具体应用要看我们所要写的test类是否需要进行数据库数据交互。
号外号外!!! 如果我们的javabean里面的属性是private修饰的,而且还没有get set方法(例如id,如果我们考虑的是自增长或者使用sequnce,我们是不支持对id进行set的),
测试的时候又需要用到id,该怎么办呢?
我们可以用java给我们提供的映射去操作,这个类是Field,在java.lang.reflect下面。
接下来看下具体的代码实现,这段代码是一个工具类下面的一个方法,去给一个class set id;
public static void setDomainId(Class<?> clazz, Object domain, String key, Object value, boolean isSupperField) {
try {
if (isSupperField) {
clazz = clazz.getSuperclass();
}
Field field = clazz.getDeclaredField(key);
field.setAccessible(true);
field.set(domain, value);
} catch (Exception e) {
e.printStackTrace();
}
}
除了id,其他属性也可以用这个,原理是一样的。
reflectionset get 方法
public static <T> void reflectionSet(Class<? super T> clazz, T obj, String name, Object value) {
Field field = null;
while (!Object.class.equals(clazz)) {
try {
field = clazz.getDeclaredField(name);
break;
} catch (NoSuchFieldException e) {
clazz = clazz.getSuperclass();
}
}
try {
field.setAccessible(true);
field.set(obj, value);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static <T, R> R reflectionGet(Class<? super T> clazz, T obj, String name) {
Field field = null;
while (!Object.class.equals(clazz)) {
try {
field = clazz.getDeclaredField(name);
break;
} catch (NoSuchFieldException e) {
clazz = clazz.getSuperclass();
}
}
try {
field.setAccessible(true);
return (R) field.get(obj);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
Junit+Mock单元测试的更多相关文章
- junit+mock+spring-test构建后台单元测试
from:从0开始,构建前后端分离应用 1. 一些基本概念 1.1 为什么要进行单元测试?我自己的理解是 1.能够快速发现问题.避免衍生BUG的出现 在对一些现有代码进行修改时,或者修改现有B ...
- Java单元测试(Junit+Mock+代码覆盖率)---------转
Java单元测试(Junit+Mock+代码覆盖率) 原文见此处 单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测 ...
- JUnit + Mockito 单元测试(二)
摘自: http://blog.csdn.net/zhangxin09/article/details/42422643 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 入门 ...
- JUnit + Mockito 单元测试(二)(good)
import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mockito; import java.util.Lis ...
- 使用Junit进行单元测试
使用Junit进行单元测试 一.目的和要求 JUnit是一款由Erich Gamma(<设计模式>的作者)和Kent Beck(极限编程的提出者)编写的开源的回归测试框架,供Java编码人 ...
- JUnit & JMockit单元测试
JUnit&JMockit单元测试总结 1.JUnit简介 Java单元测试框架业内应用较多的是JUnit,它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的 ...
- JUnit + Mockito 单元测试
原 JUnit + Mockito 单元测试(二) 2015年01月05日 17:26:02 sp42a 阅读数:60755 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...
- java如何使用JUnit进行单元测试
注:所有内容都是在eclipse上实现,关于eclipse的安装和jdk的安装配置,请看:http://www.cnblogs.com/fench/p/5914827.html 单元测试是什么? 百度 ...
- JUnit 4 单元测试
Individual Project ——JUnit 4 单元测试 学习到JUnit单元测试,我拿来测试之前写过的一个计算器(两个依存类:Calc.java CalcFunction.java).代码 ...
随机推荐
- 灰度图像--频域滤波 傅里叶变换之离散时间傅里叶变换(DTFT)
学习DIP第22天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不 ...
- vue中单选框与多选框的实现与美化
我们在做一些页面时,可能会用到很多的单选框和复选框,但是原生的radio和checkbox前面的原型图标或方框样式不尽人意.于是,决定自己来实现单选框和复选框.我用的是vue,所以就用vue的方式实现 ...
- ETL工具-KETTLE教程专栏1----术语和定义
1-资源库 资源库是用来保存转换任务的,用户通过图形界面创建的的转换任务可以保存在资源库中. 资源库可以使多用户共享转换任务,转换任务在资源库中是以文件夹形式分组管理的,用户可以自定义文 ...
- 关于项目在网页中运行部分jsp出现乱码(由request.getRequestDispatcher("XXX.jsp").forward(request, response)造成)的解决方法
在写jsp的时候发现部分的jsp在浏览器预览时出现乱码,为一堆问号,如图: 当时问了同学,只有部分jsp会出现乱码,因为重新建一个jsp在运行就没有错误,可以显示出来,所以发现是jsp头部的错误,当新 ...
- JavaWeb-SpringSecurity自定义登陆配置
系列博文 项目已上传至guthub 传送门 JavaWeb-SpringSecurity初认识 传送门 JavaWeb-SpringSecurity在数据库中查询登陆用户 传送门 JavaWeb-Sp ...
- gcd表(欧几里得定理)
题目:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=797 gcd表 时间限制:1000 ms | 内存限制:65535 KB 难度:3 ...
- vue中getters不更新数据解决办法
在 Vue.js devtools 中看到,我们明明更改了仓库 state 中的数据,但是我们的 getters 就是值渲染一次之后就不再重新渲染了 解决方法:使用 Vue.set() 方法,就是专门 ...
- rocketmq的linux搭建环境
3.3. 上传解压[两台机器] # 上传 apache-rocketmq.tar.gz 文件至/usr/local # tar -zxvf apache-rocketmq.tar.gz -C /usr ...
- Tooltip 文字提示
常用于展示鼠标 hover 时的提示信息. 基础用法 在这里我们提供 9 种不同方向的展示方式,可以通过以下完整示例来理解,选择你要的效果. 使用content属性来决定hover时的提示信息.由pl ...
- NGUI中UILabel使用url标签的一个bug
在NGUI里,UILabel控件可以支持一些简单功能的标签,使文本显示更丰富及实现类似超链接的功能.但是在使用的时候发现了NGUI3.5.9版本里存在着一个bug.不过还好修复这个bug也很简单. 在 ...