【发布时间】:2020-05-25 08:34:47
【问题描述】:
我有一个简单的类,它基于一个简单的规则构建一个RequestMessage。
- 如果在数据库中找到
MessageMetadata,则使用该元数据构建消息。 - 否则,将使用提供元数据的服务构建消息。
这是课程以及 Spock 测试。测试失败并显示MissingPropertyException,表示找不到使用该服务创建的RequestMessage。
class MessageService{
MessageBuilder messageBuilder;
MessageRepository messageRepository;
MessageMetadaProvider messageMetaDataProvider;
public RequestMessage getMessage(String id ) {
try {
MessageMetadata metadata = repository.findDefaulMessage(id);
RequestMessage requestMessage = builder.createMessage(metadata);
return requestMessage;
} catch (DataNotFoundException e) {
e.printStackTrace();
}
MessageMetadata metadata = messageMetaDataProvider.createNewMessageMetadata(id);
RequestMessage message = messageBuilder.buildNew(id , metadata);
return message;
}
}
def "Build Request Message "() {
given:
String id = '12345'
MessageBuilder messageBuilder = Mock()
MessageRepository messageRepository = Mock()
MessageMetadaProvider messageMetaDataProvider = Mock()
MessageService service = createMessageService(messageRepository,messageBuilder,messageMetaDataProvider)
MessageMetadata metadata = new MessageMedata(id, MessageType.DEFAULT)
when:
RequestMessage requestMessage = messageService .getMessage(id )
then:
1 * messageRepository.repository.findDefaulMessage(id) >> {throw new DataNotFoundException("Not Found")}
1 * messageMetaDataProvider.createNewMessageMetadata(id) >> metadata
1 * messageBuilder.buildNew(id , metadata) >> requestMessage
}
我真的很想了解为什么这不起作用。对于成功测试此测试的任何帮助,我表示感谢。谢谢
【问题讨论】:
-
带有许多依赖类的代码不构成MCVE。此外,您的示例类中存在不一致,例如
messageBuilder与builder和messageRepository与repository。然后在你的测试中有messageRepository.repository好像messageRepository有一个属性或getter 也命名为repository这至少会很奇怪。
标签: java unit-testing spock