今天在用Junit进行单元测试的时候,遇到一个诡异的问题。测试代码如下:
Java类:Calculate.java
public class Calculate {
public int sum(int var1, int var2) {
System.out.println("Adding values " + var1 + " + " + var2);
return var1 + var2;
}
public int subtract(int var1,int var2){
System.out.println("Subtract values "+ var1+" - "+ var2);
return var1-var2;
}
}
测试类:ParameterizedCalculateTest.java
@RunWith(Parameterized.class)
public class ParameterizedCalculateTest {
private int expected;
private int var1;
private int var2;
public ParameterizedCalculateTest(int expected, int var1, int var2) {
this.expected = expected;
this.var1 = var1;
this.var2 = var2;
}
@Parameters
public static Collection prepareParamters() {
return Arrays.asList(new Integer[][] { { 3, 1, 2 }, { 5, 2, 3 },
{ 7, 3, 4 }, { 9, 4, 5 } });
}
@Test
public void testSum() {
System.out.println("Additions with parameters,first:" + var1 + " and second:" + var2);
Calculate cal = new Calculate();
Assert.assertEquals(expected, cal.sum(var1, var2));
}
}
错误堆栈如下:
java.lang.Exception: No tests found matching Method testSum(com.milan.gjunit.ParameterizedCalculateTest) from org.junit.internal.requests.ClassRequest@739495b8
at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:40)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestMethodReference.<init>(JUnit4TestMethodReference.java:25)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:54)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
刚开始看到异常信息:"java.lang.Exception: No tests found matching Method testSum",猜测难道测试类的方法名要和对应java类中的方法名一样么?试下呗,于是将测试类改为:
@RunWith(Parameterized.class)
public class ParameterizedCalculateTest {
private int expected;
private int var1;
private int var2;
public ParameterizedCalculateTest(int expected, int var1, int var2) {
this.expected = expected;
this.var1 = var1;
this.var2 = var2;
}
@Parameters
public static Collection prepareParamters() {
return Arrays.asList(new Integer[][] { { 3, 1, 2 }, { 5, 2, 3 },
{ 7, 3, 4 }, { 9, 4, 5 } });
}
@Test
public void sum() {
System.out.println("Additions with parameters,first:" + var1 + " and second:" + var2);
Calculate cal = new Calculate();
Assert.assertEquals(expected, cal.sum(var1, var2));
}
}
结果还是不行。。。
果断搜索之,搜到stackoverflow上有类似的问题:
http://stackoverflow.com/questions/12798079/initializationerror-with-eclipse-and-junit4-when-executing-a-single-test/18438718#18438718。
于是乎抱着试试看的想法,扩展Parameterized.Java如下:
public class IDECompatibleParameterized extends Parameterized {
public IDECompatibleParameterized(Class<?> klass) throws Throwable {
super(klass);
}
public void filter(Filter filter) throws NoTestsRemainException {
super.filter(new FilterDecorator(filter));
}
/**
* Running single test in case of parameterized test causes issue as explained in
* http://youtrack.jetbrains.com/issue/IDEA-65966
*
* As a workaround we wrap the original filter and then pass it a wrapped description
* which removes the parameter part (See deparametrizedName)
*/
private static class FilterDecorator extends Filter {
private final Filter delegate;
private FilterDecorator(Filter delegate) {
this.delegate = delegate;
}
@Override
public boolean shouldRun(Description description) {
return delegate.shouldRun(wrap(description));
}
@Override
public String describe() {
return delegate.describe();
}
}
private static Description wrap(Description description) {
String name = description.getDisplayName();
String fixedName = deparametrizedName(name);
Description clonedDescription =
Description.createSuiteDescription(fixedName,description.getAnnotations().toArray(new Annotation[0]));
for(Description child : description.getChildren()){
clonedDescription.addChild(wrap(child));
}
return clonedDescription;
}
private static String deparametrizedName(String name) {
//Each parameter is named as [0], [1] etc
if(name.startsWith("[")){
return name;
}
//Convert methodName[index](className) to
//methodName(className)
int indexOfOpenBracket = name.indexOf('[');
int indexOfCloseBracket = name.indexOf(']')+1;
return name.substring(0,indexOfOpenBracket).concat(name.substring(indexOfCloseBracket));
}
}
PS:装饰器模式用的很赞。。。
然后再把测试类改为:
@RunWith(IDECompatibleParameterized.class)
public class ParameterizedCalculateTest {
private int expected;
private int var1;
private int var2;
public ParameterizedCalculateTest(int expected, int var1, int var2) {
this.expected = expected;
this.var1 = var1;
this.var2 = var2;
}
@Parameters
public static Collection prepareParamters() {
return Arrays.asList(new Integer[][] { { 3, 1, 2 }, { 5, 2, 3 },
{ 7, 3, 4 }, { 9, 4, 5 } });
}
@Test
public void sum() {
System.out.println("Additions with parameters,first:" + var1 + " and second:" + var2);
Calculate cal = new Calculate();
Assert.assertEquals(expected, cal.sum(var1, var2));
}
}
修改点为:
@RunWith(IDECompatibleParameterized.class)
果断Pass。
记录下,顺便对国际友人表示感谢,希望对遇到类似问题的朋友有所帮助。
分享到:
相关推荐
名人档案(辛弃疾、李清照)(1).docx
._moood UI KitAdobeXD源码下载设计素材UI设计
full_circle_appAdobeXD源码下载设计素材UI设计
Gym_Responsive_Landing_PageAdobeXD源码下载设计素材UI设计
sql,SQL(Structured Query Language,结构化查询语言)是一种标准化的语言,用于在关系数据库管理系统(RDBMS)中存取和操作数据。SQL 使得用户能够访问和操作数据库中的数据,包括数据的查询、插入、更新和删除,以及数据库结构的创建和修改。
一个很烂的项目但是获第二十二届江西省学生信息素养提升实践活动一等奖、第三十八届江西省青少年科技创新大赛二等奖
JAVA文件压缩与解压缩实践(源代码+论文)
Event_Responsive_Landing_PageAdobeXD源码下载设计素材UI设计
这是宁波创客大赛 Timer 项目的Github
汽车价格离群值检测.zip
大家好!这是近期通过前端技术实现的一个“酷炫黑白粒子空间旋转特效”,本资源包含完整的可执行代码(下载文件,解压后可以点击运行)和运行特效展示,该内容已经在博客中记录:https://xiexu.blog.csdn.net/article/details/132677358(预计于2025年发布)。欢迎正在学习前端的朋友下载练手~
JAVAWEB网络相册
codeforce Rudolf and the Another Competition的C语言写法(用了sort)
打印模板乐器五线谱A4打印模板高清待办练字模板PDF下载
物流大数据服务平台HTML模板源码 大数据大屏展示源码 VUE
FANUC 操作手册
南京大学南园教学楼 7.m4a
人工智能的基础数学.pdf
【资源说明】 Java毕业设计 基于springboot学生成绩可视化系统源码+部署文档+全部数据资料.zipJava毕业设计 基于springboot学生成绩可视化系统源码+部署文档+全部数据资料.zipJava毕业设计 基于springboot学生成绩可视化系统源码+部署文档+全部数据资料.zip 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过mac/window10/11测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
AEM-CoreComponents-UI-KitAdobeXD源码下载设计素材UI设计