如何检查arquillian测试中是否已调用该方法

时间:2016-05-09 18:56:55

标签: java java-ee junit jms jboss-arquillian

我用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方法,但在这种情况下如何使用它?

1 个答案:

答案 0 :(得分:0)

您可能打算使用:

TimeUnit.SECONDS.sleep(5);

而不是

TimeUnit.SECONDS.wait(5);