我正在编写一个内存实现的队列服务(类似于Amazon SQS),用于本地测试。
根据规范,非空队列上的pull()调用不必返回消息。如果只有一个消费者,我的内存中实现将始终返回一条消息。因此,第一个测试用例(在SQS规范方面是正确的)显然是无用的,即使是一个空的pull()实现总是返回null也会传递:
@Test
public void testPushAndPullBySpec() {//useless
QueueService qs = new InMemoryQueueService();
qs.push("TEST_MSG_1");
Message message = qs.pull();
Assert.assertTrue(message == null || message.getBody().equals("TEST_MSG_1"));
if (message != null) {
qs.delete(message.getReceiptHandle());
}
}
此实现看起来很有意义,但它实际上与规范相矛盾,不能与其他实现一起使用:
@Test
public void testPushAndPullByImpl() {
QueueService qs = new InMemoryQueueService();//could fail if another implementation was used
qs.push("TEST_MSG_1");
Message message = qs.pull();
Assert.assertTrue(message.getBody().equals("TEST_MSG_1"));
qs.delete(message.getReceiptHandle());
}
所以,我唯一的问题是:在这种情况下如何正确编写单元测试?