如何在 Spring 中将测试套件从 JUnit 迁移到 Cucumber 以进行单元测试?

How to migrate test suites from JUnit to Cucumber for Unit Tests in Spring?

就我所做的研究而言,我看到 Cucumber 用于集成测试,而不是用于单元测试。但我想知道是否有可能迁移到 Cucumber,因为测试在 Cucumber classes 中更具可读性和易于更改。

假设这是我的控制器测试 class;

@WebMvcTest(value = Controller.class)
class ControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private Service service;

    private XDTO xDTO;

    private List<XDTO> xDTOList;

    @BeforeEach
    void setUp() {
        xDTOList = new ArrayList<>();
        X x= new X();
        xDTO = new XDTO();
        xDTO.setId(x.getId());
        xDTOList.add(xDTO);
    }

    @Test
    public void initialize_success() throws Exception {
        when(service.initialize()).thenReturn(xDTO);

        mockMvc.perform(MockMvcRequestBuilders.post(X + INITIALIZE)
                        .accept(APPLICATION_JSON))
                .andExpect(status().isCreated())
                .andExpect(jsonPath("$.id", is(xDTO.getId())));
    }

如何通过启动部分上下文(如 JUnit)将其更改为 Cucumber 测试 class?

Cucumber 不用于单元测试,因为 Cucumber 的主要优点是能够使用抽象的高级自然语言表达您正在检查的行为。那种语言不太适合单元测试,单元测试应该更加关注单元行为的细节。

如果您在 Cucumber 中使用低级抽象并记录事情是如何完成的,您最终会遇到冗长的场景,这些场景很快就会变得笨拙且难以处理。

one testing tool to test (rule) them all 的想法最初非常吸引人。我被它强烈吸引了一段时间。随着更多的 cuking 经验,很明显这个想法是有缺陷的。单元测试工具更适合编写单元测试,它易于循环、模拟和进行更详尽的测试。如果您正确实施它们,它们总是 运行 也会快得多。

这种在不同规模上使用不同工具的想法并不是什么新鲜事,它几乎适用于人类的每一项努力。测试也不例外。使用 Cucumber 来描述(理想情况下驱动)system/application 的高级行为。使用单元测试对单元进行更小的详细测试。