【问题标题】:ERROR with java.lang.Exception: Test class should have exactly one public constructorjava.lang.Exception 错误:测试类应该只有一个公共构造函数
【发布时间】:2018-07-18 09:28:29
【问题描述】:

我在运行 JUnit 测试时遇到异常。

java.lang.Exception: Test class should have exactly one public constructor

下面是我的代码 sn-p,有什么想法吗?

package com.tests;    

import org.junit.Rule;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;


public class AllTests implements TestRule {
    private int retryCount;

    private AllTests(int retryCount) {
        this.retryCount = retryCount;
    }

    public Statement apply(Statement base, Description description) {
        return statement(base, description);
    }

    private Statement statement(final Statement base, final Description description) {
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                Throwable caughtThrowable = null;

                // implement retry logic here
                for (int i = 0; i < retryCount; i++) {
                    try {
                        base.evaluate();
                        return;
                    }
                    catch (Throwable t) {
                        caughtThrowable = t;
                        System.err.println(description.getDisplayName() + ": run " + (i + 1) + " failed");
                    }
                }
                System.err.println(description.getDisplayName() + ": giving up after " + retryCount + " failures");
                throw caughtThrowable;
            }
        };
    }

    @Rule
    public AllTests allTests = new AllTests(3);

    @ClassRule
    public static DockerComposeRule docker = wi.getDocker(logs);

    @Override
    public DockerComposeRule getDocker() {
        return docker;
    }

    @Test
    public void myFirstTest() throws Exception {
        // Test code here...
    }
}

我正在使用 Gradle 运行 JUnit 测试。这是一个 Java 项目,它直接失败了。 我尝试了很多东西,但无济于事。如果您愿意,很乐意提供更多详细信息。

【问题讨论】:

    标签: java unit-testing exception junit


    【解决方案1】:

    信息很清楚:

    java.lang.Exception: 测试类应该只有一个公共 构造函数

    您将单元测试类与同一类中的规则测试类合并:AllTests
    您应该在自己的类中定义您的规则并删除此构造函数:

    private AllTests(int retryCount) {
        this.retryCount = retryCount;
    }
    

    【讨论】:

    • 然后我得到以下信息:java.lang.Exception: Test class should have exactly one public zero-argument constructor
    • 更改为无 arg 构造函数会导致进一步失败:public AllTests allTests = new AllTests(3);
    • 但您不必在测试类中提供 arg。在引用的问题中,不是测试类的构造函数有arg,而是内部类是Rule。
    • 啊,我明白了,在那种情况下 - 它对我不起作用,因为我有一些静态声明,而内部类不能有静态声明。不过感谢您的帮助,不胜感激!
    猜你喜欢
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2017-08-27
    相关资源
    最近更新 更多