使用 spock 和所有测试通过测试我的模型映射器

Testing My model mapper with spock and all test passes

您好,我对 spock groovy 测试有疑问。我需要为我的模型映射器编写一个单元测试,但即使我想写错,我的测试也总是通过: 这是我的模型映射器:

public class ModelMapper {
    public ConferenceRoomDto fromConferenceRoomToConferenceRoomDto(ConferenceRoom conferenceRoom) {
        return conferenceRoom == null ? null : ConferenceRoomDto.builder()
                .roomName(conferenceRoom.getRoomName())
                .description(conferenceRoom.getDescription())
                .projector(conferenceRoom.getProjector())
                .phoneNumber(conferenceRoom.getPhoneNumber())
                .numberOfSeats(conferenceRoom.getNumberOfSeats())
                .build();

这是我的测试:

given:
    ConferenceRoom conferenceRoom1 = ConferenceRoom.builder()
            .roomName("r")
            .projector(true)
            .description("d")
            .phoneNumber("23")
            .build()
    when:
    modelMapper.fromConferenceRoomToConferenceRoomDto(conferenceRoom1)
    then:
    ConferenceRoomDto conferenceRoomDto1 = ConferenceRoomDto.builder()
            .build()
}

这个 tets 应该会失败,因为我为我的会议室提供了值,我希望 dto 没有值,但所有测试都通过了。

好的 - 所以你在这里测试有两个问题。

  1. =表示赋值。要检查相等性,您需要在测试的最后一行使用 ==。这不是 Spock 特有的东西 - 它是适用于我遇到的每种编程语言的通用规则:

    • a = b表示将值b赋给变量a.
    • a == b 表示 'true' 如果 ab 在某种程度上是 'equal',否则 'false'。

    Spock 期望 then 块中的代码以可以计算为 true(表示测试通过)或 false.

    [ 的表达式结尾=42=]
  2. 你的最后一行,即使它使用了正确的 == 运算符,实际上并没有将你的期望值与上一行返回的值进行比较。我相信您正在寻找的是:

    when:
    def result = modelMapper.fromConferenceRoomToConferenceRoomDto(conferenceRoom1)
    then:
    result == ConferenceRoomDto.builder().build()
    

    在 Spock 中,我相信更地道的表达方式是:

    expect:
    modelMapper.fromConferenceRoomToConferenceRoomDto(conferenceRoom1)
        == ConferenceRoomDto.builder().build()
    

重申一下,这两个问题都与您使用 Spock 无关。在任何测试框架或编程语言中,甚至在测试之外,你都会遇到同样的问题。

您没有在您的示例中测试任何内容,因为 ConferenceRoomDto conferenceRoomDto1 = ConferenceRoomDto.builder().build() 只是作业而不是测试。这就是测试总是通过的原因。

改变你的测试例如:

def 'DTO is mapped from bean'() {
    given:
    ConferenceRoom conferenceRoom1 = ConferenceRoom.builder()
            .roomName("r")
            .projector(true)
            .description("d")
            .phoneNumber("23")
            .build()
    when:
    ConferenceRoomDto dto = modelMapper.fromConferenceRoomToConferenceRoomDto(conferenceRoom1)

    then:
    dto.roomName == 'r'
    dto.projector
    dto.description == 'd'
    dto.phoneNumber == '23'
}

then 部分现在有 4 个进行测试的断言。例如 roomName 值等于 'r'.