当前位置: 首页 > 知识库问答 >
问题:

Spock测试失败,缺少属性异常

何承
2023-03-14

我有一个简单的类,它基于一个简单的规则构建一个quiestMessage

  • 如果在数据库中找到MessageMetadata,则使用该元数据生成消息

这是这门课和一个斯波克测试。测试失败时,出现MisSingProperty tyExc0019,表示无法找到使用该服务创建的UrestMessage

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
}

我真的很想理解为什么这不起作用。我非常感谢在成功测试这项测试中得到的任何帮助。非常感谢。

共有2个答案

戎永福
2023-03-14

尝试在给定的块而不是when块中声明requestMessage

Spock生命周期有一些令人惊讶的行为,其中之一是交互在when块之前处理。

南门峰
2023-03-14

问题确实是母鸡对鸡蛋的问题,我在对Jaco0646的回答的评论中提到了这个问题。让我在MCVE中重现核心问题:

package de.scrum_master.stackoverflow.q60143388;

public class RequestMessage {}
package de.scrum_master.stackoverflow.q60143388;

public class MessageService {
  MessageBuilder messageBuilder;

  public RequestMessage getMessage(String id) {
    return messageBuilder.buildNew(id);
  }
}
package de.scrum_master.stackoverflow.q60143388

import spock.lang.Specification

class MessageServiceTest extends Specification {
  def "build request message"() {
    given:
    def id = "12345"
    MessageBuilder messageBuilder = Mock()
    MessageService messageService = new MessageService()
    messageService.messageBuilder = messageBuilder

    when:
    RequestMessage requestMessage = messageService.getMessage(id)

    then:
    1 * messageBuilder.buildNew(id) >> requestMessage
  }
}

这将产生:

groovy.lang.MissingPropertyException: No such property: requestMessage for class: de.scrum_master.stackoverflow.q60143388.MessageServiceTest

    at de.scrum_master.stackoverflow.q60143388.MessageServiceTest.build request message(MessageServiceTest.groovy:17)

只是声明请求消息中的给定:块作为Jaco0646建议,然后使用它作为存根结果不会单独完成。您需要确保首先声明一个对象(例如mock)要由Builder方法返回,但将测试中的方法调用的结果分配给另一个变量,以便您可以比较这两个变量或执行您喜欢执行的任何验证:

package de.scrum_master.stackoverflow.q60143388

import spock.lang.Specification

class MessageServiceTest extends Specification {
  def "build request message"() {
    given:
    def id = "12345"
    RequestMessage requestMessage = Mock()
    MessageBuilder messageBuilder = Mock()
    MessageService messageService = new MessageService()
    messageService.messageBuilder = messageBuilder

    when:
    RequestMessage result = messageService.getMessage(id)

    then:
    1 * messageBuilder.buildNew(id) >> requestMessage
    result.toString().startsWith("Mock for type 'RequestMessage'")
  }
}

现在测试通过了,引导问题也解决了。不能使用方法调用创建对象,然后同时将其指定为预期的存根结果。这没有逻辑意义。

 类似资料:
  • 我用编写了以下测试(使用框架时): 然而,当我运行它时,字段似乎丢失了。我得到以下错误: 我想知道为什么,因为我在一节中声明了它。你能帮我吗?

  • 我正在为Junit编写测试,以测试我编写的删除函数: 此方法适用于同时具有前后节点的双链接列表。 问题是:我们的大学将针对我们编写的测试运行错误代码,以确定我们是否编写了足够的测试来捕获错误代码和异常。 我知道他们将运行的两个测试,但不知道错误的含义。 > 失败:缺少逻辑 故障:缺少NextNodeRepairLogic 这是我没有考虑的两个测试,因为我无法理解这些错误的含义。有人知道这些错误可能

  • 下面是源代码和测试代码,有人能让我知道我做错了什么吗?似乎根本没有调用dao mock并返回“USA”。我在网上做了一些研究,找不到我做错了什么。 下面是我的Spock测试代码:

  • 我试图用spock为我的一个方法写一个测试。 方法如下所示- 我还模拟了我将要调用的dao对象: 所以最后到了斯波克夹具上。我已经把冒犯的比较线评论掉了,并在适当的地方做了一个工作。我的问题是--为什么我的“then”块中的第一行会失败?

  • 我用Spock测试Java代码。我测试这段代码: 我写了一个测试: 它失败是因为抛出了另一个CustomException。但是在块中,我捕获这个异常并抛出一个,因此我希望我的方法将抛出,而不是。如何测试它?

  • 在使用Oracle DB和JDK 17升级到Spring Boot 2.5.7时,我在Maven上运行测试时出现了这个奇怪的错误。 错误是:[ERROR]无法执行目标org.apache.maven.plugins:maven-surefire-plugin:2.19.1:test(default-test)on project kkd: Exection default-test of目标org