2016-09-08 18 views
3

私はEJB TimerServiceモックを作成しています。 @Timeoutアノテーションを持つメソッドへの呼び出しを手動でトリガーする方法はありますか?@Timeoutアノテーションをトリガーする方法は?

+1

Uhm ...そのメソッドを呼び出しますか? – Seelenvirtuose

+0

大丈夫です。それを試みます。 – user840930

+0

SomeServiceが私のTimeServiceMockを注入しています。 SomeServiceにはTimeoutアノテーションを持つメソッドがあります。私のTimeServiceMockからTimeoutアノテーションを使ってSomeServiceメソッドを呼び出す方法を知らないでください。何か案は? – user840930

答えて

3

新しいタイマーを優先期間で作成することができます。あなたが期間を持つタイムアウト呼び出しのコードセグメントを呼び出す必要があるとき。その後、フレームワークは今から一定の時間内にタイムアウトメソッドを呼び出す必要があります。

コンテキスト。 getTimerService()。 createTimer(デュレーション「Hello World!」);

全コード

import javax.annotation.Resource; 
import javax.ejb.SessionContext; 
import javax.ejb.Timer; 
import javax.ejb.Stateless; 
import javax.ejb.Timeout; 

@Stateless 
public class TimerSessionBean implements TimerSessionBeanRemote { 

    @Resource 
    private SessionContext context; 

    public void createTimer(long duration) { 
    context.getTimerService().createTimer(duration, "Hello World!"); 
    } 

    @Timeout 
    public void timeOutHandler(Timer timer){ 
    System.out.println("timeoutHandler : " + timer.getInfo());   
    timer.cancel(); 
    } 
} 
0

今度は

方法が公開されていないことを考慮してみましょう。

@Timeoutと注釈されたメソッドに含まれるロジックのみをテストする場合は、いくつかの解決策があります。 最後のデザインをお勧めします。全体的なデザインも改善されるからです(this answer参照)。

  1. このメソッドをprotectedまたはpackage-privateにします。これは、そのロジックをテスト可能にする最も簡単な方法です。
  2. リフレクションまたはPowerMockを使用してプライベートメソッドを呼び出します。

は、ここでは、Timerインスタンスtimerinstance.timeOutHandlerMethodを呼び出すようにしたいと仮定して、簡単な例です。

Whitebox.invokeMethod(instance, "timeOutHandlerMethod", timer); 

詳細については、doc pageを参照してください。

  1. ロジックを抽出してクラスを分離し、代わりにテストします。

ここでは、this.timeOutHandlerからDelegate.executeにロジックを抽出します。これに

@Timeout 
private void timeOutHandler(Timer timer) { 
    // some complicated logic 
    timer.cancel(); 
} 

Delegate

private Delegate delegate; 

@Timeout 
private void timeOutHandler(Timer timer) { 
    delegate.execute(timer); 
} 

のように宣言:

class Delegate { 

    public void execute(Timer timer) { 
     // some complicated logic 
     timer.cancel(); 
    } 
} 

今、私たちはテストを書くことができますDelegateクラス。

関連する問題