简体   繁体   English

junit java 的参数化测试构造函数错误消息:测试 class 应该只有一个公共零参数构造函数

[英]parameterized test constructor of junit java error message: Test class should have exactly one public zero-argument constructor

I can really use some help with this parameterized test case I am trying to create.对于我正在尝试创建的这个参数化测试用例,我真的可以使用一些帮助。 No matter what kind of constructor I create the IDE gives an error message.无论我创建哪种构造函数,IDE 都会给出错误消息。 Here is my code:这是我的代码:

@RunWith(Parameterized.class)
public class SolverTest {
    final static File folder = new File("C:\\Users\\Azizam\\IdeaProjects\\EightPuzzle\\src\\ModifiedTests");
    final static String destFolder = "C:\\Users\\Azizam\\IdeaProjects\\EightPuzzle\\src\\testresults";
    final static ArrayList<Object[][]> filesList = new ArrayList<>();
    final Object currentBoard = new Object();

    @Parameterized.Parameters
    public static Iterable<Object[][]> data() {
        String path = "";
        int counter = 0;
        for (final File fileEntry : folder.listFiles()) {
            //System.out.println("processing file: " + fileEntry.getName())
            counter++;
            if (counter == 20) break;
            path = destFolder + fileEntry;
            In in = new In(fileEntry.getAbsolutePath());
            int n = in.readInt();
            int moves = in.readInt();
            int[][] tiles = new int[n][n];
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
                    tiles[i][j] = in.readInt();
            Board b = new Board(tiles);
            Object[][] fileList = new Object[][]{{b, moves}};
            filesList.add(fileList);
        }
        return filesList;
    }

    @Parameterized.Parameter(0)
    private Board board;
    @Parameterized.Parameter(1)
    private int expectedNumberOfMoves;

    public SolverTest(Board board, int expectedNumberOfMoves) {
        this.board = board;
        this.expectedNumberOfMoves = expectedNumberOfMoves;
    }


    @Test
    public void test() {
        assertEquals(expectedNumberOfMoves, new Solver(board).moves());
    }

}

I have tried different ways of creating a 1 parameter, 2, and no parameter constructors.我尝试了不同的方法来创建 1 参数、2 和无参数构造函数。 But I have never seen this type of issue or what the solution might be.但我从未见过这类问题或解决方案可能是什么。 I am following this link and this tutorial.我正在关注链接和教程。 This is my first parameterized test, and debug does not seem to provide much for me either.这是我的第一个参数化测试,调试似乎也没有为我提供太多帮助。 I also saw these links, but they did not help.我也看到了这些链接,但它们没有帮助。 I can provide the code for the rest of the project also on GitHub or gist.我也可以在 GitHub 或 gist 上提供项目的 rest 的代码。 I did debug my code through creating the fileList properly, but I know little about what happens to it afterwards or what needs to happen.我确实通过正确创建 fileList 来调试我的代码,但我对之后会发生什么或需要发生什么知之甚少。 Here is an excerpt of the error:这是错误的摘录:

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

    at org.junit.runners.BlockJUnit4ClassRunner.validateZeroArgConstructor(BlockJUnit4ClassRunner.java:171)
    at org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters.validateConstructor(BlockJUnit4ClassRunnerWithParameters.java:90)
    at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:127)
    at org.junit.runners.ParentRunner.validate(ParentRunner.java:416)
    at org.junit.runners.ParentRunner.<init>(ParentRunner.java:84)
    at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65)
    at org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters.<init>(BlockJUnit4ClassRunnerWithParameters.java:27)
    at org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParametersFactory.createRunnerForTestWithParameters(BlockJUnit4ClassRunnerWithParametersFactory.java:16)
    at org.junit.runners.Parameterized.createRunnersForParameters(Parameterized.java:313)
    at org.junit.runners.Parameterized.<init>(Parameterized.java:248)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
    at org.junit.vintage.engine.discovery.DefensiveAllDefaultPossibilitiesBuilder$DefensiveAnnotatedBuilder.buildRunner(DefensiveAllDefaultPossibilitiesBuilder.java:113)

Here is the latest version of my code:这是我的代码的最新版本:

package assignments;

import edu.princeton.cs.algs4.In;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.io.File;
import java.util.ArrayList;

import static junit.framework.TestCase.assertEquals;

@RunWith(Parameterized.class)
public class SolverTest {
    final static File folder = new File("C:\\Users\\Azizam\\IdeaProjects\\EightPuzzle\\src\\ModifiedTests");
    final static String destFolder = "C:\\Users\\Azizam\\IdeaProjects\\EightPuzzle\\src\\testresults";
    final static ArrayList<Object[][]> filesList = new ArrayList<>();
    final Object currentBoard = new Object();

    @Parameterized.Parameters
    public static Iterable<Object[][]> data() {
        String path = "";
        int counter = 0;
        for (final File fileEntry : folder.listFiles()) {
            //System.out.println("processing file: " + fileEntry.getName())
            counter++;
            if (counter == 20) break;
            path = destFolder + fileEntry;
            In in = new In(fileEntry.getAbsolutePath());
            int n = in.readInt();
            int moves = in.readInt();
            int[][] tiles = new int[n][n];
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
                    tiles[i][j] = in.readInt();
            Board b = new Board(tiles);
            Object[][] fileList = new Object[][]{{b, moves}};
            filesList.add(fileList);
        }
        return filesList;
    }

    @Parameterized.Parameter(0)
    public Board board;
    @Parameterized.Parameter(1)
    public int expectedNumberOfMoves;

    public SolverTest() {
    }


    @Test
    public void test() {
        assertEquals(expectedNumberOfMoves, new Solver(board).moves());
    }

}

Here is a pic of the debug session showing everything I want in the file list.这是调试 session 的图片,显示了文件列表中我想要的所有内容。 Some how the board object does not transfer to my Solver constructor.有些板子 object 不会转移到我的 Solver 构造函数。 在此处输入图像描述

调试捕获 Here is what the no-arg constructor error means.这是无参数构造函数错误的含义。

The constructor in the test class is the following:测试 class 中的构造函数如下:

public SolverTest(Board board, int expectedNumberOfMoves) {
    this.board = board;
    this.expectedNumberOfMoves = expectedNumberOfMoves;
}

That takes 2 arguments, so is not a no-arg constructor.这需要 2 个 arguments,因此不是无参数构造函数。 The following is a no-arg constructor:以下是无参数构造函数:

public SolverTest() {
}

Removing the 2-arg constructor will work, so this does not need to be explicitly listed, because the java compiler will add the default no-arg constructor automatically.删除 2-arg 构造函数将起作用,因此不需要显式列出,因为 java 编译器会自动添加默认的无参数构造函数。

HOWEVER the reason for the error is a mix of 2 approaches for the Parameterized test class.然而,错误的原因是Parameterized测试 class 的两种方法的混合。

EITHER use a no-arg constructor with the @Parameterized.Parameters fields (which need to be public and not private, by the way), OR remove those fields and use the construct with arguments that take the parameters.要么使用带有@Parameterized.Parameters字段的无参数构造函数(顺便说一下,这些字段需要是公共的而不是私有的),或者删除这些字段并使用带有参数的 arguments 的构造。

Here is the code modified to use the first approach (that is, with the @Parameterized.Parameters fields):这是修改为使用第一种方法的代码(即,使用@Parameterized.Parameters字段):

@RunWith(Parameterized.class)
public class SolverTest {
    final static File folder = new File("C:\\Users\\Azizam\\IdeaProjects\\EightPuzzle\\src\\ModifiedTests");
    final static String destFolder = "C:\\Users\\Azizam\\IdeaProjects\\EightPuzzle\\src\\testresults";
    final static ArrayList<Object[][]> filesList = new ArrayList<>();
    final Object currentBoard = new Object();

    @Parameterized.Parameters
    public static Iterable<Object[][]> data() {
        String path = "";
        int counter = 0;
        for (final File fileEntry : folder.listFiles()) {
            //System.out.println("processing file: " + fileEntry.getName())
            counter++;
            if (counter == 20) break;
            path = destFolder + fileEntry;
            In in = new In(fileEntry.getAbsolutePath());
            int n = in.readInt();
            int moves = in.readInt();
            int[][] tiles = new int[n][n];
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
                    tiles[i][j] = in.readInt();
            Board b = new Board(tiles);
            Object[][] fileList = new Object[][]{{b, moves}};
            filesList.add(fileList);
        }
        return filesList;
    }

    @Parameterized.Parameter(0)
    public Board board;
    @Parameterized.Parameter(1)
    public int expectedNumberOfMoves;

    public SolverTest() {
    }


    @Test
    public void test() {
        assertEquals(expectedNumberOfMoves, new Solver(board).moves());
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 java.lang.Exception:测试类应该只有一个公共零参数构造函数: - java.lang.Exception: Test class should have exactly one public zero-argument constructor: 返回错误“测试类应具有完全一个公共零参数构造函数” - Error “Test class should have exactly one public zero-argument constructor” is returned 测试类应该只有一个公共零参数构造函数 - Test class should have exactly one public zero-argument constructor 没有Runnable方法和Test类应该只具有一个公共的零参数构造函数 - No Runnable methods and Test class should have exactly one public zero-argument constructor Spring Boot org.junit.runners.model.InvalidTestClassError: Invalid test class 1. 测试 class 应该只有一个公共零参数构造函数 - Spring Boot org.junit.runners.model.InvalidTestClassError: Invalid test class 1. Test class should have exactly one public zero-argument constructor 初始化错误:测试类应该只有一个公共零参数 - initializationError: Test class should have exactly one public zero-argument java.lang.Exception错误:测试类应该恰好具有一个公共构造函数 - ERROR with java.lang.Exception: Test class should have exactly one public constructor 我们应该总是在类中使用零参数构造函数吗? - Should we always have a zero-argument constructor in a Class? java.lang.Exception: 测试类应该只有一个公共构造函数 - java.lang.Exception: Test class should have exactly one public constructor JUnit 类应该只有一个公共构造函数 - JUnit class should have exactly one public constructor
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM