![](/img/trans.png)
[英]java.lang.Exception: Test class should have exactly one public zero-argument constructor:
[英]parameterized test constructor of junit java error message: Test class should have exactly one public zero-argument constructor
對於我正在嘗試創建的這個參數化測試用例,我真的可以使用一些幫助。 無論我創建哪種構造函數,IDE 都會給出錯誤消息。 這是我的代碼:
@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());
}
}
我嘗試了不同的方法來創建 1 參數、2 和無參數構造函數。 但我從未見過這類問題或解決方案可能是什么。 我正在關注此鏈接和本教程。 這是我的第一個參數化測試,調試似乎也沒有為我提供太多幫助。 我也看到了這些鏈接,但它們沒有幫助。 我也可以在 GitHub 或 gist 上提供項目的 rest 的代碼。 我確實通過正確創建 fileList 來調試我的代碼,但我對之后會發生什么或需要發生什么知之甚少。 這是錯誤的摘錄:
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)
這是我的代碼的最新版本:
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());
}
}
這是調試 session 的圖片,顯示了文件列表中我想要的所有內容。 有些板子 object 不會轉移到我的 Solver 構造函數。
測試 class 中的構造函數如下:
public SolverTest(Board board, int expectedNumberOfMoves) {
this.board = board;
this.expectedNumberOfMoves = expectedNumberOfMoves;
}
這需要 2 個 arguments,因此不是無參數構造函數。 以下是無參數構造函數:
public SolverTest() {
}
刪除 2-arg 構造函數將起作用,因此不需要顯式列出,因為 java 編譯器會自動添加默認的無參數構造函數。
然而,錯誤的原因是Parameterized
測試 class 的兩種方法的混合。
要么使用帶有@Parameterized.Parameters
字段的無參數構造函數(順便說一下,這些字段需要是公共的而不是私有的),或者刪除這些字段並使用帶有參數的 arguments 的構造。
這是修改為使用第一種方法的代碼(即,使用@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.