2016-05-09 10 views
0

arquillianとwilfdlyサーバーでjmsをテストしています。ここでは簡単なテストがあります:Arquillianテストでそのメソッドが呼び出されたかどうかを確認する方法

@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; 
      } 
     }; 
    } 

あなたは正しいメッセージ(「Test message1」)でこれにRuntimeExceptionが表示されます。つまり、applyメソッドが呼び出されたことを意味します。 hasBeenInvokedがまだ偽である理由は明確ではありませんか?

生成されたFunctionはMDB Beanで使用されており、このBeanの実装は必要ないと思います。私が言ったように、あなたが例外をスローするとすぐに、そのメソッドが呼び出されるのを見ることができます。質問は、最後の主張がテストで失敗した理由は何ですか?

代わりに、おそらくapplyメソッドが呼び出されたかどうかをmockitoで調べることができますが、この場合どのように使用できますか?

答えて

0

あなたはおそらく使用することを意味:

TimeUnit.SECONDS.sleep(5);

代わりの

TimeUnit.SECONDS.wait(5);

関連する問題