1. @Injectable 与 @Mocked的不同
import mockit.Injectable;
import mockit.Mocked;
import org.junit.Assert;
import org.junit.Test;import java.util.Locale;//@Mocked 与@Injectable的不同
public class MockedAndInjectable {@Testpublic  void testMocked(@Mocked Locale locale){//静态方法不起作用了,返回了nullAssert.assertTrue(Locale.getDefault() == null);//非静态方法(返回类型为string)也不起作用,返回了nullAssert.assertTrue(locale.getCountry() == null);//自己new一个,也同样如此,方法都被mock了Locale chinaLocale = new Locale("zh","CN");Assert.assertTrue(chinaLocale.getCountry() == null);}@Testpublic  void testInjectable(@Injectable Locale locale){//静态方法不mockAssert.assertTrue(Locale.getDefault() != null);//非静态方法(返回类型为string)也不起作用了,返回null,但仅仅限于locale这个对象Assert.assertTrue(locale.getCountry() == null);//自己new一个,并不受影响Locale chinaLocale = new Locale("zh","CN");Assert.assertTrue(chinaLocale.getCountry().equals("CN"));}
}
  • @Injectable 也是告诉 JMockit生成一个Mocked对象,但@Injectable只是针对其修饰的实例,而@Mocked是针对其修饰类的所有实例。
  • 此外,@Injectable对类的静态方法,构造函数没有影响。因为它只影响某一个实例嘛!
  1. @Tested & @Injectable 两个好基友,通常搭配使用
    为便于演示,我们以电商网站下订单的场景为例:在买家下订单时,电商网站后台程序需要校验买家的身份(是否合法,例如是否在黑名单中),若下订单没有问题还要发邮件给买家。 相信下面的代码,你一定能看明白 。
// 邮件服务类,用于发邮件
public interface MailService {/*** 发送邮件* @param userId           邮件接受人id* @param content         邮件内容* @return 发送成功了,就返回true,否则返回false*/public boolean sendMail(long userId, String content);
}
// 用户身份校验
public interface UserCheckService {/*** 校验某个用户是否是合法用户* * @param userId    用户ID* @return 合法的就返回true,否则返回false */public boolean check(long userId);
}//订单服务类 ,用于下订单
import javax.annotation.Resource;public class OrderService {//邮件服务类,用于向某用户发邮件MailService mailService;@ResourceUserCheckService userCheckService;//构造函数public  OrderService(MailService mailService){this.mailService = mailService;}/** 下订单* @param buyerId   买家ID* @param itemId    商品ID* @return 返回下订单是否成功* */public boolean submitOrder(long buyerId, long itemid){//先校验用户身份if(!userCheckService.check(buyerId)){//用户身份不合法return  false;}/*下单逻辑代码省略。。。。下单完成后,给买家发邮件* */if (!this.mailService.sendMail(buyerId, "下单成功")){//邮件发送失败return false;}return true;}
}

假设现在我们需要测试OrderService类的submitOrder方法,可是OrderService依赖MailService,UserCheckService类,在测试过程中,我们并不想真正连结邮件服务器,也不想连结校验用户身份的服务器校验用户身份,怎么办呢?
此时@Tested与@Injectable就排上用场了!请看下面的测试程序:

import mockit.Expectations;
import mockit.Injectable;
import mockit.Tested;
import org.junit.Test;//@Tested 与@injectable搭配使用
public class TestedAndInjectable {//@Tested 修饰的类,表示是我们要测试对象,在这里表示,我想测试订单服务类。JMockit也会帮我们实例化这个测试对象@TestedOrderService orderService;long testUserId = 1234561;     //测试用户idlong testItemId = 4567891;     //测试商品id//测试注入方式@Testpublic  void testSubmitOrder(@Injectable MailService mailService,@Injectable UserCheckService userCheckService){new Expectations(){{//当向testUserId发邮件时,假设都发成功了mailService.sendMail(testUserId,anyString);result = true;//当检验testUserId的身份时,假设该用户都是合法的userCheckService.check(testUserId);result = true;}};//JMockit 帮我们实例化了mailService了,并通过OrderService的构造函数,注入到OrderService对象中//JMockit 帮我们实例化了userCheckService了,并通过OrderService的属性,注入到OrderService对象中Assert.assertTrue(orderService.submitOrder(testUserId, testItemId));}
}
  1. @Tested & @Injectable功能总结

@Injectable 也表示一个Mocked对象,相比@Mocked,只不过只影响类的一个实例。而@Mocked默认是影响类的所有实例。@Tested表示被测试对象。如果该对象没有赋值,JMockit会去实例化它。

@Tested的构造函数有参数,则JMockit通过在测试属性&测试参数中查找@Injectable修饰的Mocked对象注入@Tested对象的构造函数来实例化,不然,则用无参构造函数来实例化。除了构造函数的注入,JMockit还会通过属性查找的方式,把@Injectable对象注入到@Tested对象中。

注入的匹配规则:先类型,再名称(构造函数参数名,类的属性名)。若找到多个可以注入的@Injectable,则选择最优先定义的@Injectable对象。当然,我们的测试程序要尽量避免这种情况出现。因为给哪个测试属性/测试参数加@Injectable,是人为控制的。

  1. 什么测试场景,我们要使用@Tested & @Injectable
    显然,当我们需要手工管理被测试类的依赖时,就需要用到@Tested & @Injectable。
    两者搭配起来用,JMockit就能帮我们轻松搞定被测试类及其依赖注入细节。

(四)JMockit 的API:@Injectable 与 @Mocked的不同--基础篇相关推荐

  1. (四)nodejs循序渐进-函数,类和对象(基础篇)

    上一篇文章讲到了基本数据类型和运算符,相信大家都能做简单的运算,本篇文章将讲述函数,类,对象. 函数 在nodejs中,一个函数可以作为另一个函数的参数.我们可以先定义一个函数,然后传递,也可以在传递 ...

  2. (三)JMockit API:@Mocked -基础篇

    @Mocked可以修饰一个类,接口等. 当@Mocked修饰一个类 import mockit.Mocked; import org.junit.Assert; import org.junit.Te ...

  3. Vue2+VueRouter2+webpack 构建项目实战(四)接通api,先渲染个列表

    Vue2+VueRouter2+webpack 构建项目实战(四)接通api,先渲染个列表:  Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(一)基础知识概述 ...

  4. Exynos4412的Linux5.4.174时钟驱动开发(四)——clk API的调用方法

    系列文章目录 Exynos4412的Linux时钟驱动开发(一)--Exynos4412的时钟管理单元CMU Exynos4412的Linux时钟驱动开发(二)--时钟驱动的初始化(CLK_OF_DE ...

  5. 银行卡四元素校验API 验证姓名手机号码身份证号码银行卡号是否一致

    银行卡四元素校验API,检测输入的姓名.手机号码.身份证号码.银行卡号是否一致.通过https://www.juhe.cn/docs/api/id/213申请APPKEY 1.银行卡四元素检测 接口地 ...

  6. 企业工商四要素核验 API:有效应对商业欺诈和恶意交易的利器

    引言 企业工商四要素核验是一种用于验证企业基本信息的方法,主要包括企业名称.社会统一信用代码.法人名称.法人身份证四个要素.这些要素是企业注册时必须提供的信息,通过对这些信息的验证,可以确定企业的真实 ...

  7. Java SE基础(十四)常用API

    Java SE基础(十四)常用API 概述 Object类 构造方法 成员方法 toString()方法 equals(Object obj)方法 Arrays排序 Arrays类概述 Arrays成 ...

  8. 企业工商四要素核验API 推荐

    今天就来给大家推荐一款API -- 企业工商四要素核验API,希望能帮助到有需要的小伙伴~ 企业工商四要素核验,支持国内3400+个城市以及国际4万个城市的实况数据:更新频率分钟级别. 它接口使用起来 ...

  9. 大模型开发(四):OpenAI API调用方法

    全文共8500余字,预计阅读时间约17~30分钟 | 满满干货(附代码示例),建议收藏! 代码下载点这里 一.获取OpenAI的API keys 前提:拥有OpenAI账户,并可以魔法上网 如果涉及账 ...

最新文章

  1. Java源码详解三:Hashtable源码分析--openjdk java 11源码
  2. Keepalived实现LVS的高可用全解析
  3. 爬虫学习笔记(十三)—— scrapy-redis(二):存储到MySQL、Scrapy项目部署
  4. SOAMANAGER配置后无法登录问题
  5. es6语法-let定义变量和常量
  6. 多麦克风做拾音的波束_麦克风阵列是什么 有哪些关键技术?
  7. java之异常java.net.MalformedURLException解决办法
  8. php正则匹配怎么写,正则表达式 - 求助怎么写php的正则匹配
  9. C#预处理器指令 用法
  10. BZOJ2217 [Poi2011]Lollipop 【贪心】
  11. CSS Positioning页面
  12. Spark的这些事lt;二gt;——几个概念
  13. linux下 mysql5.5数据库迁移操作
  14. ubuntu下安装ros出现“无法下载-package.ros.org中某个包-校验和不符”的解决方法...
  15. V4L2像素格式及其对应的含义
  16. The `certs(%1$s)` contains the merchant‘s certificate serial number(%2$s) which is not allowed here.
  17. js实现的万年历显示
  18. python量化投资:简介和策略以及研究流程
  19. amd cpu排行_2020英特尔cpu排行_2019 cpu天梯图 intel和amd cpu性能排行
  20. 物联网挑战赛【从零到一】

热门文章

  1. 基于C#程序触摸屏软件盘开发总结
  2. python+opencv代码给证件照换底色(别再用PS啦)(转载)
  3. 前端工程师年终总结(2019)
  4. 重构改善既有代码设计
  5. MySQL之存储过程及函数的使用
  6. amd处理器更新zen4服务器芯片,AMD Zen4接口AM5曝光:改用LGA触点式、告别脆弱的针脚...
  7. 鸿蒙系统有通知服务器吗,鸿蒙系统通知栏怎么清除和打开?鸿蒙系统没有下拉菜单怎么回事?...
  8. 抖音创作规范_抖音创作内容调整提示怎么办
  9. 哪些企业可以做知识产权贯标,你不得不了解的事!
  10. 基于模板替换的word文档自动生成