2016-09-01 9 views
2

を注入することが傾けるときの動作をテストし、私はそれが両方の停止およびキャンセル呼び出すことを滅ぼすの動作をテストしたいMockito:モックオブジェクトは

@Startup 
@Singleton 
public class PRCConnectionRunner { 

@Inject 
private ServiceStatus status; 

private Timer connectorTimer = null; 

public void destroy() { 
    connectorTimer.cancel(); 
    status.stopped(); 
} 
} 

として定義されたメソッドを持っています。私はそれがPRCConnectionRunnerクラス内に構成されているように、私はconnectorTimerを注入カントしかし

@Mock 
ServiceStatus status; 

@InjectMocks 
PRCConnectionRunner prcConnection; 


@Test 
public void destroyShouldCallStatusStop() { 
    prcConnection.destroy(); 
    Mockito.verify(status).stopped(); 
} 

以下のように状態のモックオブジェクトを注入することによって停止させ、容易にテストすることができ、どのように呼び出しをキャンセル破壊することをテストすることができる()connectorTimerオン?

+2

でいくつかのより多くのMockito/PowerMockの例を見つけることができます

@RunWith(PowerMockRunner.class) public class TestConnectionRunner @Mock ServiceStatus status; @InjectMocks PRCConnectionRunner prcConnection; @Mock Timer timerMock; @Test public void destroyShouldCallStatusStop() { MemberModifier.field(PRCConnectionRunner.class, "connectorTimer").set(prcConnection, timerMock); prcConnection.destroy(); Mockito.verify(status).stopped(); Mockito.verify(timerMock).cancel(); } } 

、これはMockito(またはEasyMock)では不可能で、各モックオブジェクトで作成したので、テストは何らかの形でテスト中のオブジェクトに*渡されなければなりません。内部で作成または取得されたオブジェクトをモックするには、Mockitoに加えてPowerMockを使用するか、JMockitライブラリを使用する必要があります。 –

+0

私はそれを間違ってテストしていますか?または私のデザインが間違っていますか? – Saad

+1

'Timer'フィールドを設定するためにプレーンな古いリフレクションを使うのはどうでしょうか?それは基本的に '@ Inject'の仕組みの基礎です。 – SpaceTrucker

答えて

1

PowerMockitoを使用できます。 MemberModifierはプライベートメンバーの設定を可能にし、タイマーモックを「注入」して検証することができます。 PowerMockitoを使用するには、@RunWith(PowerMockRunner.class)でテストクラスに注釈を付ける必要があります。また、このようなものでなければなりません:あなたは一般的には、このlink

+0

MemberModifierはどのパッケージですか?私の食はそれを見つけることができません。また、私はあなたがconnectorTimerではなくtimerMockを意味した最後の行を信じていましたか?Mockito.verify(connectorTimer).cancel(); – Saad

+0

私はMockitoの代わりにpowermockを意味すると思いますか? – Saad

+0

あなたが正しいです - 答えを更新しました(コードが実行されていない場合はどうなりますか) – asch

関連する問題