2017-05-13 4 views
0

依存性注入にHK2を使用しており、JUnit-TestのコンテキストでMockito-mockでシングルトンオブジェクトを置き換えたいとします。 JUnitのテストスタブは以下の通りであるMockitoとHK2の使い方は?

import javax.inject.Inject; 
import org.jvnet.hk2.annotations.Service; 

@Service 
public class A { 

    @Inject 
    private B b; 

    public String test() { 
     return b.toString(); 
    } 

} 

@Service 
public class B { 

    public String toString() 
    { 
     return "B"; 
    } 

} 

に対し:

import static org.junit.Assert.*; 

import javax.inject.Inject; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.jvnet.hk2.testing.junit.HK2Runner; 
import org.mockito.Mockito; 
import org.mockito.junit.MockitoJUnitRunner; 

@RunWith(MockitoJUnitRunner.class) 
public class MockTest extends HK2Runner { 

    private B bMock = Mockito.mock(B.class); 

    @Inject 
    private A a; 

    @Test 
    public void test() { 
     Mockito.when(bMock.toString()).thenReturn("Mock"); 
     assertEquals("Mocking worked", "Mock", a.test()); 
    } 

} 

IはAにはなく、注入されるB用のモックしたい次のように

最も簡単な設定は次のようになり実際のオブジェクト。どのようにしてHK2をグローバルに設定できますか?Bのすべてのインスタンスについて、モックが使用されるようにしますか? 私はコンストラクタ経由の注入を使用して、BにAをローカルに注入できることをすでに知っています。

答えて

1

あなたはMockではなくBの@Stubを使用すると考えましたか?これはHK2-metadata-を動作させるためには

public class MockTest extends HK2Runner { 

    @Inject 
    private A a; 

    @Test 
    public void test() { 
     assertEquals("Mocking worked", "Mock", a.test()); 
    } 

    @Stub @Rank(1) 
    public static abstract class BStub extends B { 
     public String toString() { 
      return "Mock"; 
     } 

    } 

} 

@Service @Contract 
public class B { 

    public String toString() 
    { 
     return "B"; 
    } 

} 

というよりモック使用@Stubを使用して:あなたはBの実装に@Contractを追加できることを行うにはジェネレータは、コンパイル中にテストのクラスパスにあるはずですので、スタブを生成できます。スタブに@Rank(1)を置くと、元のBクラスより確実に選択されます。

希望すると便利です。

関連する問題