Test class should have exactly one public zero-argument constructor

异常复现
public class Demo {
private int i;
public Demo(int i) {
this.i= i;
}
private void f(){
System.out.println("普通方法"+i);
}
@Test
public void method(){
Demo demo = new Demo(25);
demo2.f();
}
}
分析
异常说的很清楚,测试类需要提供一个 public 权限的 无参构造函数。而 Demo 类中,只有一个有参构造。
为什么需要无参构造,主要源自于 Java 的单元测试框架 JUnit 的工作机制。
-
JUnit 的反射机制: JUnit 通过反射来创建测试类的实例,以执行测试用例。而反射机制要求测试类必须有一个公共的无参构造函数,这样 JUnit 才能顺利地创建对象。
-
依赖注入: JUnit 经常使用依赖注入来为测试类提供依赖。这种机制也需要一个公共的无参构造函数来创建测试类的实例,然后注入所需的依赖。
总结来说,测试类拥有一个公共的无参构造函数是 JUnit 正常工作以及保证代码与其他测试框架兼容性的必要条件。
解决方案
当一个类没有任何构造函数时,默认有一个隐式的无参构造。显示的写了其他构造函数,就需要显示的写无参构造。
为Demo 类显示添加无参构造函数,或者删除有参构造函数,改用 set 注入属性。就能解决该问题。
扩展
上述 Demo 类的类名不能写成 Test 。这也是我曾经踩过的一个坑