Eclipse中 Junit 正常运行完了 可是方法覆盖率全红 解决办法 (附带②EclEmma插件安装方法④覆盖率抽出与合并)
■前言
今天修改完代码之后,修改对应的Junit。
对于目前这个工程,之前有一次案件对于,在整个工程中,使用Junit4 + JMockit方式,来实现Junit。
之前修改的测试类,都是通过以下方式实现的
XXXXXTest extends DJunitTestCase
而我修改的代码,之前的担当者,漏了修改了。
--------------------------
于是我修改代码如下 (粉色部分是我修改的)
@RunWith(JMockit.class)
XXXXXTest extends TestCase{
@Test
public void XXXTest() {。。。}
。。。。
}
修改之后,就出现了标题中描述的内容
Eclipse中 Junit 正常运行完了 可是方法覆盖率全红
--------------------------
■问题原因
Eclipse的EclEmma插件使用时,做了【除外:Excludes】的处理
比如,下面的位置,填写「com.sxz.demo.*」
那么,这个包下面所有的类,对应的Junit执行时,都不会统计覆盖率。
测试代码执行后,即使正常完了,每行代码都是红色,而不是期待的绿色。
(设置的目的:为了解决 类子的属性多出了一个 $jacocoData
本文最下面,■相关知识2 中详细说明)
■问题原因推测(推测错误),但是内容是正确的
1.@Test注解与继承TestCase混用
---------------------------------
继承TestCase:Junit3的方式,方法名以test为前缀, 方法名以test为前缀 , 方法名以test为前缀!!
@Test注解:Junit4的方式,方法上使用注解@Test
---------------------------------
2.继承 TestCase时,所有的标注(Annotation)失效
---------------------------------
所有方法,没有以test为前缀,@Test又失效了,
因此,该方法虽然正常执行了,但是么有被统计!!!
追记,今天看了代码,方法是以testXXX这种形式存在的。
---------------------------------
3.扩展
@BeforeClass和@AfterClass是JUnit4得新特性,
标记有@BeforeClass的方法会载所有的测试方法执行开始前运行,
标记有@AfterClass的方法会在所有的测试方法运行结束后执行。
4.继承关系
TestCase继承了Assert
可以直接使用Assert中定义的镜头方法,简化代码
-----------------------------------
■相关知识1
1.Maven引用
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>1.21</version>
</dependency>
2.Eclipse中,Junit执行后,代码覆盖率相关的插件:EclEmma
3.代码相关
import mockit.Deencapsulation;
import mockit.Expectations;
import mockit.Injectable;
import mockit.Mock;
import mockit.MockUp;
import mockit.Mocked;
import mockit.NonStrictExpectations;
import mockit.Tested;
import mockit.Verifications;
import mockit.integration.junit4.JMockit;import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;@RunWith(JMockit.class)
public class HelloDemoTest {/*** mock公有方法*/@Testpublic void testPublicMethod() {final HelloDemo hello= new HelloDemo ();// 设定期待值new Expectations(hello) {{hello.getAnything();result = 100;times = 1;}};// 断言Assert.assertEquals(100, hello.getAnything());// 方法执行次数new Verifications() {{hello.getAnything();times = 1;}};}
}
如果继承Assert,上面的断言就可以直接写了,不需要前面的类
4.关于反射
问: 为什么我们会在Junit代码中,会经常看到反射的使用。
回答:我们可以通过反射,调用类的私有方法
https://blog.csdn.net/fy_java1995/article/details/80088733
https://blog.csdn.net/yizhenn/article/details/52384582
5.DJunit 与 Eclipse 中的EclEmma 插件
貌似使用这个插件,无法统计出来Djunit写的代码的覆盖率,
所有,后来换成Junit4
6.Junit4 + JMockit
https://blog.csdn.net/yizhenn/article/details/52384582
===
Mockito和JMockit
(JMockit、EasyMock、Mockito和PowerMock)
https://www.jb51.cc/java/122225.html
===
7.反射相关的代码
7.0 获取Class对象的三种方法
- Class.forName(“类的全限定名”) // 下面我们将使用这一种
- 实例对象.getClass()
- 类名.class (类字面常量)
7.1 调用构造函数创建类
// 反射的类,自定义了构造函数,构造函数中,只有一个String参数
// 每一个类都默认有一个无参的构造函数,但是但我们自己定义后,默认的无参的构造函数便消失了
// 如果父类是抽象类,继承父类,要实现父类的构造方法
// 也就是说,在自定义的构造方法的第一行,要写上supper();
Constructor<?> con = clazz.getDeclaredConstructor(String.class);
Object obj = con.newInstance("testName");
7.2调用方法
Class clazz = Class.forName("Student");
Constructor<?> con = clazz.getConstructor(String.class, int.class);
Student student = (Student) con.newInstance("MyName", 18);
Method method=clazz.getMethod("myMethod", String.class);
method.invoke(student, "gogogo");
上面的代码中,Student有一个两个参数的构造方法,和一个名字为「myMethod」的方法(此方法有一个String类型的参数)
https://blog.csdn.net/fy_java1995/article/details/80088733
7.3 构造方法反射时的区别
・getDeclaredConstructor(Class<?>... parameterTypes)
这个方法会返回制定参数类型的所有构造函数,包括public的和非public的,当然也包括private
・getDeclaredConstructors()
返回结果就没有参数类型的过滤,返回的是一个数组
・getConstructor(Class<?>... parameterTypes)
这个方法返回的是上面那个方法返回结果的子集,只返回制定参数类型访问权限是public的构造函数
----
■相关知识2 :EclEmma插件安装方法
8.Eclipse插件安装方法(非常简单)
8.1 Help -->Eclipse Marketplace
8.2 输入插件名字「EclEmma」然后回车,点击按照即可
■相关知识3(一般代码不会遇到这个坑)
使用覆盖率的方式执行测试代码时,类中会多出下面这个属性
$jacocoData(Java Code Coverage)
所有如果,使用反射取得类的属性(Fileds)时,会多取出来一个属性。
今天就遇到了这个问题,
正常执行Junit代码时,可以正常完了,
而是用覆盖率执行时,代码里面直接报错,说类的属性(Fields)的个数不正确。
因为,测试对象代码里面,取得了类的属性的个数进行判断,当不正确时,抛出异常
比如这个类里面有两个属性,正常执行时,取得的属性就是2个,所有没有问题;
而当使用覆盖率方式执行代码时,取得的属性个数是3个,不正确,抛出异常!
解决方法,把这个类,设置为覆盖率统计对象外,
这样,在Junit执行时,这个类便不会多出一个$jacocoData 属性来。
-----
■相关知识4 :覆盖率抽出与合并
■カバレッジ抽出(覆盖率抽出与合并)
https://www.cnblogs.com/Echo-41/p/6922993.html
(使用 Junit4 + JMockit ),按照下面步骤,可以到处覆盖率的文件
Java -> Coverage Report -> Next -> 选择导出格式(推荐HTML)-> 选择导出目录 -> Finished
(导出前,如果执行多次,可以合并多次执行后的覆盖率)
--------
step1
step2 (现在虽然安装了插件,但是没有使用Junit4,也许是因为这个原因,自己的电脑的Eclipse中看不到,
但是,在单位的开发环境中是可以看到的。)
--
自己的电脑的效果如下(感觉和Junit4没有什么关系,应该是插件版本和Eclipse版本的问题)
-----
Eclipse中 Junit 正常运行完了 可是方法覆盖率全红 解决办法 (附带②EclEmma插件安装方法④覆盖率抽出与合并)相关推荐
- oneno浏览器插件_三款好用的浏览器插件,附带浏览器插件安装方法
大家好,今天给大家推荐几款好用浏览器插件 正文开始之前先给一些小白同学讲一下什么是浏览器插件 简单来说,如果把浏览器比作一个windows系统的话 插件就相当于系统中安装的软件 可以让我们的浏览器更好 ...
- 浏览器怎样更新java,Eclipse中js文件修改后浏览器不能及时更新的解决办法
现在就分别把IE,firefox,chrome中解决办法贴出来供大家参考: 1.firefox(火狐浏览器)解决问题 第一步,在浏览器中敲入:about:config ,然后回车 第二步,在显示出的内 ...
- eclipse中格式化代码快捷键Ctrl+Shift+F失效的解决办法
很长一段时间我的eclipse都有个毛病,就是当我要格式化代码的时候,右键-source-format能够起效,但ctrl+shift+f不好使了. 可以基本断定是快捷键与别的软件冲突了,但一直也没时 ...
- IDEA中导入VUE后,JS文件爆红解决办法
原因:可能是js版本不兼容的问题,修改如下图: 点击File–>settings,搜索:JavaScript,如图修改
- eclipse中生成的html存在中文乱码问题的解决方法
eclipse中生成的html存在中文乱码问题的解决方法 参考文章: (1)eclipse中生成的html存在中文乱码问题的解决方法 (2)https://www.cnblogs.com/bug-hu ...
- eclipse中maven项目pom文件第一行报错解决方法
eclipse中maven项目pom文件第一行报错解决方法 参考文章: (1)eclipse中maven项目pom文件第一行报错解决方法 (2)https://www.cnblogs.com/wxym ...
- Eclipse中Errors occurred during the build最简单的解决方法
Eclipse中Errors occurred during the build最简单的解决方法 参考文章: (1)Eclipse中Errors occurred during the build最简 ...
- eclipse插件安装方法
eclipse插件安装方法 手工安装:访问xxx插件官网,按照提示,下载最新的zipped文件.解压features和plugins目录 到$HELIOS_HOME/dropins/xxx目录下,重启 ...
- 合成实验中,十三种后处理方法:实验室常用13种后处理方法、故障及解决办法
合成实验中,十三种后处理方法:实验室常用13种后处理方法.故障及解决办法 1.有机酸碱性化合物的分离提纯 具有酸碱性基团的有机化合物,可以得失质子形成离子化合物,而离子化合物与原来的母体化合物具有不同 ...
最新文章
- 使用opencv训练目标检测模型基于cascade模型
- 批处理中setlocal enabledelayedexpansion
- RHCS图形界面建立GFS共享上
- 微服务限流Sentinel讲解(四)
- 【JPA】注解@PostConstruct、@PreDestroy
- linux avahi-daemon进程 网络服务 简介
- 网络管理的5大功能!
- pandas之Series
- [Educational Round 5][Codeforces 616F. Expensive Strings]
- 如何让学习变得像游戏一样好玩
- iPhone 13凌晨发布,电池容量较iPhone 12最高有望提升20%(文末有福利)
- 一级计算机框线设置为窄线,计算机等级一级MS Office考题:第二套字处理题
- centos7 sh 注释_在CentOS7上安装RocketMQ 4.7.1
- 克罗谈投资策略05_涨势买入,跌势卖出
- 关于登录chkdsk的方法
- centos6.7 搭建jenkins
- 自适应自旋锁--吞吐量和延迟以及管理开销的折中
- 信用评分python_信用评分卡模型在Python中实践(上)
- vb利用计算机 鸡兔同笼,VB程序题:利用计算机解决古代数学瓿“鸡兔同笼问题”。即已知在同一笼子里有总数为m只鸡和兔,鸡和兔的总脚数为n只,求鸡和兔各有多少只? VB源码 龚沛曾...
- svnserver目录浏览器可以访问,但客户端不可以访问,解决方法。
热门文章
- matlab jpeg 工具包,安装Matlab JPEG Toolbox
- python 类和对象 有必要学吗_Python学习——对类和对象的初步理解,初识,与
- 大数据集合求交集_还记得学生时代数学老师教的“集合”吗?
- 主成分分析、因子分析和聚类分析的区别
- 项目经理杂谈(上)____________加速步伐!
- Windows 8 Directx 开发学习笔记(六)添加水模型
- 论软件开发中的可信赖的工作
- centos7删除符号链接_如何在 Linux 上查找和删除损坏的符号链接 | Linux 中国
- JVM调优总结 系列文章
- 【读书笔记】深入分析Java Web技术内幕-Cookie与Session