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

Java 使用spock和所有测试通过测试我的模型映射器,java,testing,groovy,spock,Java,Testing,Groovy,Spock,您好,我对spock groovy测试有问题。我需要为我的模型映射器编写一个单元测试,但我的测试总是通过ok,即使我想写错: 这是我的模型映射器: public class ModelMapper { public ConferenceRoomDto fromConferenceRoomToConferenceRoomDto(ConferenceRoom conferenceRoom) { return conferenceRoom == null ? null : Co

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

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

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

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

=表示分配。要检查是否相等,需要在测试的最后一行使用==。这不是斯波克特有的东西-这是适用于我遇到的每种编程语言的一般规则:

a=b表示将值b分配给变量a。 a==b表示“真”,如果a和b在某种程度上“相等”,则表示“真”,否则表示“假”。 Spock期望then块中的代码以表达式结尾,该表达式的计算结果为true,表示测试通过或为false

最后一行,即使使用了right==运算符,实际上也没有将预期值与前一行返回的值进行比较。我相信你想要的是:

when:
def result = modelMapper.fromConferenceRoomToConferenceRoomDto(conferenceRoom1)
then:
result == ConferenceRoomDto.builder().build()
在斯波克,我相信一种更为惯用的表达方式是:

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”。

测试中有任何断言吗?没有,我使用spock-我读到没有断言,但我认为我解决了这个问题:我随时更改主体,这对我有帮助