我有一个简单的类,它基于一个简单的规则构建一个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
}
我真的很想理解为什么这不起作用。我非常感谢在成功测试这项测试中得到的任何帮助。非常感谢。
尝试在给定的
块而不是
when
块中声明requestMessage
。
Spock生命周期有一些令人惊讶的行为,其中之一是交互在
when
块之前处理。
问题确实是母鸡对鸡蛋的问题,我在对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