【问题标题】:Testing My model mapper with spock and all test passes使用 spock 和所有测试通过测试我的模型映射器
【发布时间】:2019-07-08 07:04:50
【问题描述】:

您好,我遇到了 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 没有值,但所有测试都可以通过。

【问题讨论】:

  • 你的测试中有断言吗?
  • 不,我使用 spock - 我读到没有断言但我认为我解决了问题:我时不时地改变身体,这很有帮助

标签: java testing groovy spock


【解决方案1】:

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

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

    • a = b 表示将值b 赋给变量a
    • 如果ab 在某种程度上“相等”,则a == b 表示“真”,否则为“假”。

    Spock 期望 then 块中的代码以可以评估为 true(表示测试通过)或 false 的表达式结束。

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

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

    在 Spock 中,我相信更惯用的表达方式是:

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

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

【讨论】:

    【解决方案2】:

    您没有在示例中测试任何内容,因为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'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多