我用arquillian和wilfdly服务器测试jms。这是一个简单的测试:
@RunWith(Arquillian.class)
public class PubSubMdbAsyncJmsTest {
public static final String MESSAGE_1 = "Test message1";
@Inject
PubSubProducer pubSubProducer;
final AtomicBoolean hasBeenInvoked = new AtomicBoolean(false);
@Produces
public Function<String, Void> messageConsumer() {
return new Function<String, Void>() {
@Override
public Void apply(final String message) {
Assert.assertEquals(MESSAGE_1, message);
hasBeenInvoked.set(true);
return null;
}
};
}
@Deployment
public static JavaArchive createDeployment() {
JavaArchive jar = ShrinkWrap.create(JavaArchive.class)
.addClass(PubSubProducer.class)
.addClass(MdbConsumer.class)
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
System.out.println(jar.toString(true));
return jar;
}
/*
*/
@Test
public void testSendMessageAndConsumeItSuccessfully() throws InterruptedException {
pubSubProducer.sendMessage(MESSAGE_1);
TimeUnit.SECONDS.wait(5);
Assert.assertTrue(hasBeenInvoked.get());
}
}
测试在arquillian和wilfdly下运行。 Assert.assertTrue(hasBeenInvoked.get());
检查失败。如果将函数更改为(添加抛出异常):
@Produces
public Function<String, Void> messageConsumer() {
return new Function<String, Void>() {
@Override
public Void apply(final String message) {
Assert.assertEquals(MESSAGE_1, message);
if(true) throw new RuntimeException(message);
hasBeenInvoked.set(true);
return null;
}
};
}
您将看到此RuntimeException并显示正确的消息(&#34; Test message1
&#34;)。这意味着已调用apply
方法。目前尚不清楚为什么hasBeenInvoked
仍然是假的?
生成的Function在MDB bean中使用,我认为不需要实现这个bean。正如我所说,一旦抛出异常,就可以看到该方法被调用。问题是,为什么最后一个断言在测试中失败了?
作为替代方案,也许我可以使用mockito来检查是否已调用apply
方法,但在这种情况下如何使用它?
答案 0 :(得分:0)
您可能打算使用:
TimeUnit.SECONDS.sleep(5);
而不是
TimeUnit.SECONDS.wait(5);