繁体   English   中英

Java 怎么写:测试扩展了一个通用测试

[英]Java how to write : test extends a generic test

我正在编写 3 个不同的 class 测试: HardSudokuVeryHardSudokuSudoku

HardSudokuVeryHardSudoku类扩展了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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM