[英]Java how to write : test extends a generic test
我正在编写 3 个不同的 class 测试: HardSudoku
、 VeryHardSudoku
和Sudoku
。
HardSudoku
和VeryHardSudoku
类扩展了Sudoku
class。
所以我希望以尊重 DRY 原则的方式编写这三个测试,因此,我认为最好的解决方案是在测试中使用泛型。
这是我想继续的方式:
SudokuTest
class SudokuTest<T extends Sudoku> {
@Test
void test_solve_dontThrowError() {
T sudoku = new T();
assertAll(() -> sudoku.solve());
}
@Test
void test_solve_returnValidSolution() {
T sudoku = new T();
sudoku.solve();
assertTrue(SolutionChecker.isValid(sudoku.getGridSolution()));
}
}
HardSudokuTest
public class HardSudokuTest extends SudokuTest<HardSudoku> {
}
VeryHardSudokuTest
public class VeryHardSudokuTest extends SudokuTest<VeryHardSudoku> {
}
SudokuClass
测试 class 中的行:
T sudoku = new T();
是无效的,所以我想问你如何以尊重 DRY 原则的方式编写这 3 个测试? 是否可以使用泛型?
在我看来,更好的解决方案是完全废弃 generics 并按如下方式解决问题。
重构SudokuTest
class 如下:
abstract class SudokuTestHelper {
private Supplier<Sudoku> supplier;
private Sudoku sudoku;
SudokuTestHelper(Supplier<Sudoku> supplier) {
this.supplier = supplier;
}
@BeforeEach
public void setUp() {
this.sudoku = supplier.get();
}
@Test
void test_solve_dontThrowError() {
assertAll(() -> sudoku.solve());
}
@Test
void test_solve_returnValidSolution() {
sudoku.solve();
assertTrue(SolutionChecker.isValid(sudoku.getGridSolution()));
}
}
您现在可以通过创建如下所示的新测试类来测试通用数独接口的不同实现:
class HardSudokuTest extends SudokuTestHelper {
HardSudokuTest() {
super(HardSudoku::new);
}
}
你觉得这个想法怎么样? (未测试)
class SudokuTest<T extends Sudoku> {
private T sudoku; // property
public SudokuTest(T t) {
sudoku = t;
}
@Test
void test_solve_dontThrowError() {
assertAll(() -> sudoku.solve());
}
@Test
void test_solve_returnValidSolution() {
sudoku.solve();
assertTrue(SolutionChecker.isValid(sudoku.getGridSolution()));
}
}
和...
public class HardSudokuTest extends SudokuTest<HardSudoku> {
public HardSudokuTest() {
super(new HardSudoku())
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.