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

时间:2019-02-14 09:39:37

标签: java testing groovy spock

您好,我在Spock常规测试方面遇到问题。我需要为模型映射器编写一个单元测试,但是即使我想写错,我的测试也总是可以通过的: 这是我的模型映射器:

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()
}

此tet应该会失败,因为我向会议室提供了值,并且我希望dto没有值,但所有测试都可以通过。

2 个答案:

答案 0 :(得分:0)

好的-因此您在这里进行测试有两个问题。

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

    • a = b意味着将值b分配给变量a
    • 如果a == ba在某种程度上等于“相等”,则
    • 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无关。在任何测试框架或编程语言中,甚至在测试之外,您都会遇到相同的问题。

答案 1 :(得分:0)

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