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 。这也是我曾经踩过的一个坑

SystemCaller
SystemCaller

https://gravatar.com/noisily745e35dad0

文章: 47

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注