使用 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 没有值,但所有测试都通过了。
好的 - 所以你在这里测试有两个问题。
=
表示赋值。要检查相等性,您需要在测试的最后一行使用 ==
。这不是 Spock 特有的东西 - 它是适用于我遇到的每种编程语言的通用规则:
a = b
表示将值b
赋给变量a
.
a == b
表示 'true' 如果 a
和 b
在某种程度上是 'equal',否则 'false'。
Spock 期望 then
块中的代码以可以计算为 true
(表示测试通过)或 false
.
[ 的表达式结尾=42=]
你的最后一行,即使它使用了正确的 ==
运算符,实际上并没有将你的期望值与上一行返回的值进行比较。我相信您正在寻找的是:
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'
.
您好,我对 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 特有的东西 - 它是适用于我遇到的每种编程语言的通用规则:a = b
表示将值b
赋给变量a
.a == b
表示 'true' 如果a
和b
在某种程度上是 'equal',否则 'false'。
Spock 期望
[ 的表达式结尾=42=]then
块中的代码以可以计算为true
(表示测试通过)或false
.你的最后一行,即使它使用了正确的
==
运算符,实际上并没有将你的期望值与上一行返回的值进行比较。我相信您正在寻找的是: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'
.