转载:https://blog.csdn.net/paincupid/article/details/53561435

1、引入mockito jar包

<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>2.0.2-beta</version>
</dependency>

2、对于Mockito而言,有两种方式创建:

  1. mock为一个interface提供一个虚拟的实现,
  2. spy为object加一个动态代理,实现部分方法的虚拟化
  • @Mock,被标注的属性是个mock
  • @Spy,被标注的属性是个spy,需要赋予一个instance。提供了一种对真实对象操作的方法
  • @InjectMocks,将本test中的mock或者spy注入到被标注的属性中,根据构造函数的参数名,或者setter,或者私有属性名。

3、如果你使用spring,上述代码还可以进一步简化,因为Mockito提供了factory的方法用来创建mock和spy。

### 正常的bean声明

<bean id=”svc” class=”Svc”>
<bean id=”dao1” class=”…”>
<bean id=”dao2” class=”…”>

mock

<bean id="operationService" class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="com.paincupid.api.operation.OperationService" />
</bean>

请注意到svc不变化,mock将自动注入进入。这是因为spring的bean容器,如果id一样,后声明的bean会覆盖前面的bean。

spy

<bean id="daoInst"  class="DaoInstance"></bean>
<bean id="dao2" class="org.mockito.Mockito" factory-method="spy">
<constructor-arg ref="daoInst"></constructor-arg>
</bean>

同样svc不变化,直接注入。请注意spy需要获得一个实例。

4、如果不用xml的话,可以在java中注解的方式引入

FinanceServiceTest.java

package com.paincupid.springmvc.mybaitsgenerator.persistence.test;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import com.paincupid.springmvc.base.JUnitDaoBase;
import com.paincupid.springmvc.finance.domain.Finance;
import com.paincupid.springmvc.finance.persistence.FinanceMapper;
import com.paincupid.springmvc.finance.service.FinanceService; public class FinanceServiceTest extends JUnitDaoBase{ @InjectMocks
FinanceService service; @Mock
FinanceMapper mapper; @Before
public void setUp() {
MockitoAnnotations.initMocks(this);
} @Test
public void selectByExampleTest() {
Finance f = Mockito.mock(Finance.class);;
f.setBak("bak");
f.setConsumer("consumer");
String id = "1"; Mockito.when(mapper.searchFinanceById(id)).thenReturn(f);
Finance returnF = service.searchFinanceById(id);
Mockito.verify(mapper).searchFinanceById(id); Assert.assertEquals(f.getConsumer(), returnF.getConsumer()); }
}

JUnitDaoBase.java

package com.paincupid.springmvc.base;

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional; @RunWith(SpringJUnit4ClassRunner.class)
//使用classpath,会自动去class下的目录去找,所以暂时把它放到了resource目录下。
@ContextConfiguration(locations = {"classpath:/junitTestContext.xml"})
@Transactional
public class JUnitDaoBase extends AbstractTransactionalJUnit4SpringContextTests { }

配置文件junitTestContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
"
default-lazy-init="true"> <!-- 扫描service、dao组件 -->
<context:component-scan base-package="com.paincupid.springmvc.*.service,com.paincupid.springmvc.*.persistence" /> <!-- 使用jackson 支持json Java中直接返回类,而不用再使用Json转换 2015.12.27 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonHttpMessageConverter" />
</list>
</property>
</bean>
<bean id="jsonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean> <!-- 分解配置 jdbc.properites -->
<!-- <context:property-placeholder location="classpath:jdbc.properties"
/> -->
<!-- 数据源BoneCP -->
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/lee" />
<property name="username" value="lee" />
<property name="password" value="eee" />
<property name="maxConnectionsPerPartition" value="30" />
<property name="minConnectionsPerPartition" value="10" />
<property name="partitionCount" value="1" />
<property name="acquireIncrement" value="5" />
<property name="statementsCacheSize" value="100" />
</bean>
<!-- sessionFactory 将spring和mybatis整合 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- value可以填多个 -->
<property name="typeAliasesPackage"
value="com.paincupid.springmvc.system.domain,com.paincupid.springmvc.test.domain
,com.paincupid.springmvc.finance.domain" />
</bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.paincupid.springmvc.*.persistence" />
</bean> <!-- 事务 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
scope="singleton">
<property name="dataSource" ref="dataSource"></property>
</bean> <tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="select*" read-only="true" />
<tx:method name="add*" isolation="READ_COMMITTED" rollback-for="Exception" />
<tx:method name="update*" isolation="READ_COMMITTED" rollback-for="Exception" />
<tx:method name="delete*" isolation="READ_COMMITTED" rollback-for="Exception" />
</tx:attributes>
</tx:advice>
<!-- 在service层实现事务控制 -->
<aop:config>
<aop:pointcut expression="execution(* com.paincupid.springmvc.*.service.*.*(..))" id="pointCut" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointCut" />
</aop:config>
</beans>

5、其它

验证调用次数

verify(mock1, timeout(100).times(2)).get(anyInt());

除了代码中的方法,Mockito 还提供了 
- never() 没有被调用,相当于times(0) 
- atLeast(N) 至少被调用N次 
- atLeastOnce() 相当于atLeast(1) 
- atMost(N) 最多被调用N次 
超时验证

通过 timeout 我们可以进行验证程序执行时间是否符合规则。 
方法调用顺序

Inorder 可以验证方法调用的顺序 
verifyNoMoreInteractions 和 verifyZeroInteractions

verifyNoMoreInteractions:查询是否存在被调用,但未被 verify 验证的方法

verifyZeroInteractions:verifyZeroInteractions 
ArgumentCaptor 参数捕获器 
可在验证时对方法的参数进行捕获,最后验证捕获的参数值。如果方法有多个参数都要捕获验证,那就需要创建多个ArgumentCaptor对象处理。

6、下载地址:

https://git.oschina.net/paincupid/springmvc.git

7、转载请注明出处:

http://blog.csdn.net/paincupid/article/details/53561435

Mockito单测,mock service层的mapper的更多相关文章

  1. Mockito鸡尾酒第一杯 单测Mock

    鸡尾酒 Mockito是Java的单元测试Mock框架. 它的logo是一杯古巴最著名的鸡尾酒Mojito, Mojito鸡尾酒,源自古巴的哈瓦那,带有浓厚的加勒比海风情. 并不浓烈,但是喝一杯下去, ...

  2. 使用Groovy+Spock轻松写出更简洁的单测

    当无法避免做一件事时,那就让它变得更简单. 概述 单测是规范的软件开发流程中的必不可少的环节之一.再伟大的程序员也难以避免自己不犯错,不写出有BUG的程序.单测就是用来检测BUG的.Java阵营中,J ...

  3. 深入理解--SSM框架中Dao层,Mapper层,controller层,service层,model层,entity层都有什么作用

    SSM是sping+springMVC+mybatis集成的框架. MVC即model view controller. model层=entity层.存放我们的实体类,与数据库中的属性值基本保持一致 ...

  4. spring service层单元测试

    service层测试较简单,目前大多数测试主要是针对public方法进行的.依据测试方法划分,可以分为两种:基于mock的隔离测试和基于dbunit的普通测试. mock隔离测试 配置pom.xml ...

  5. 基于Wiremock创建Mock Service平台

    转载:http://blog.csdn.net/liuchunming033/article/details/52399397 1.Wiremock工具介绍 一般开发项目都会分模块进行,比如都会把前端 ...

  6. 基于Wiremock创建Mock Service平台(转)

    本文链接:https://blog.csdn.net/liuchunming033/article/details/52399397                                   ...

  7. 039医疗项目-模块四:采购单模块—采购单的创建-----------Dao层,service层,Acion层

    我们根据数据库里面的表格:生成对应的Mapper接口文件和...Mapperxml文件: YYCGD:采购单模板表. YYCGD2014:采购单动态生成表,由存储过程生成. YYCGDMX:采购单明细 ...

  8. springboot 注册dao层 service 层

    可以使用三种注解来引入DAO层的接口到spring容器中.1.@Mapper,写在每一个DAO层接口上,如下: 2.@MapperScan和@ComponentScan两者之一.前者的意义是将指定包中 ...

  9. 使用Java函数接口及lambda表达式隔离和模拟外部依赖更容易滴单测

    概述 单测是提升软件质量的有力手段.然而,由于编程语言上的支持不力,以及一些不好的编程习惯,导致编写单测很困难. 最容易理解最容易编写的单测,莫过于独立函数的单测.所谓独立函数,就是只依赖于传入的参数 ...

随机推荐

  1. CoreSight™ Technology

    ARM Cortex-M processor-based devices use the ARM CoreSight technology which introduces powerful new  ...

  2. 使用cwRsync实现windows下文件定时同步

    1.参考文献: 使用cwRsync实现windows下文件定时同步(备份) 文件同步工具CwRsync的使用方法及常用命令详解 2.背景: 当前的SCADA架构中,有1台Server,5台FE,还有1 ...

  3. C#轻量级高性能日志组件EasyLogger

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第六部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...

  4. sublime关闭自动打开上次的文件

    菜单:Preferences->settings-User 在配置中加入: "hot_exit": false, "remember_open_files" ...

  5. Codeforces 394D Physical Education and Buns 胡搞

    题目链接:点击打开链接 题意:给定n个数的序列(能够排序) 操作一次能够使得某个数++或--. 问最少操作几次使得序列变成一个等差序列 输出: 第一行输出最少操作的次数 第二行输出等差数列里的最小项 ...

  6. pthread_attr_init线程属性

    转自:http://blog.csdn.net/pbymw8iwm/article/details/6721038 1.线程属性 线程具有属性,用pthread_attr_t表示,在对该结构进行处理之 ...

  7. 来自Google的TCP BBR拥塞控制算法解析

    转自:http://blog.csdn.net/dog250/article/details/52830576 写本文的初衷一部分来自于工作,更多的来自于发现国内几乎还没有中文版的关于TCP bbr算 ...

  8. Mac iterm2 创建服务器列表

  9. UICollectionViewFlowLayout使用示例

    UICollectionViewFlowLayout使用示例 效果 源码 https://github.com/YouXianMing/iOS-Project-Examples // // ViewC ...

  10. 行尸走肉第一季/全集The Walking Dead迅雷下载

    本季The Walking Dead 1 第一季(2010)看点:<行尸走肉>讲述了警察瑞克在一次执法行动中因中弹负伤而不省人事,当他从昏迷中苏醒后却惊讶地发现,这个世界已然天翻地覆.周遭 ...