我已经写了一个集成测试使用RabbitMock以下流(发现它在GitHub上,它似乎真的很酷):
消息被添加到传入的消息队列 - >传入消息听者拾取消息 - >对其进行处理 - >把一个新的传出消息到新队列传出消息队列 - >(仅用于测试)写在SRC /测试/资源此传出队列中的听者。
一切工作(有一个重要的故障 - 间歇超时)和我做的断言,如下图所示:
List<OutgoingData> receivedMessages = new ArrayList<>();
assertTimeoutPreemptively(ofMillis(15000L), () -> {
while (receivedMessages.isEmpty()) {
OutgoingData data =
receiver.getOutgoingData();
if(data != null){
receivedMessages.add(data);
}
}
}
);
assertThat(receivedMessages.get(0)).isNotNull();
assertThat
(receivedMessages.get(0).getRecipient())
.isEqualTo("enabled@localhost");
在本次测试的超时是我面临的真正的问题。
我想知道是否有更好的方式来处理与集成测试这样的情况。
期待你的投入。
非常感谢,Banyanbat
当我给它多一点思考和跟我的团队成员之一关于这一点,点击我的注意,在java 8个期货可以在这里得到有效使用。
我实现它,如下所示和它的工作就像一个魅力。
@Test
public void basic_consume_case()
InterruptedException, ExecutionException {
IncomingData incomingData = new IncomingData();
incomingData.setRecipient("enabled@localhost");
incomingData.setSender("unblocked@localhost");
incomingData.setStoreKey("123");
incomingData.setSubject("Hello");
incomingData.setText("Hello from Test 1");
try (AnnotationConfigApplicationContext context = new
AnnotationConfigApplicationContext(
ConnectionFactoryConfiguration.class)) {
sendMessage(incomingData);
Future<OutgoingData> receivedMessageFuture = pollOutgoingQueueForData();
OutgoingData receivedMessage = receivedMessageFuture.get();
assertThat(receivedMessage).isNotNull();
assertThat(receivedMessage.getRecipient()).isEqualTo("enabled@localhost");
assertThat(receivedMessage.getContent())
...
}
}
private void sendMessage(IncomingData incomingData) {
try {
rabbitTemplate.convertAndSend("incoming-data-queue", incomingData, m -> {
m.getMessageProperties().setContentType("application/json");
return m;
});
} finally {
}
}
private Future<OutgoingData> pollOutgoingQueueForData() throws InterruptedException {
return executor.submit(() -> {
OutgoingData receivedMessage = null;
while (receivedMessage == null) {
receivedMessage = (OutgoingData)
rabbitTemplate.receiveAndConvert("outgoing-queue");
}
return receivedMessage;
});
}