2013-03-18 24 views
8

私はMockitoを使って単体テストを書いています。注入されたクラスを嘲笑するのに問題があります。問題は、注入されたクラスのうちの2つが同じ型であり、注釈によってのみ区別されることです。私が単にSomeClass.classを模倣しようとすると、そのモックは注入されず、そのオブジェクトは私のテストではnullです。どのように私はこれらのオブジェクトを模擬することができますか?同じタイプの2つのオブジェクトをMockitoでモックします

public class ProfileDAL { 

    @Inject 
    @Qualifier("qualifierA") 
    private SomeClass someClassA ; 

    @Inject 
    @Qualifier("qualifierB") 
    private SomeClass someClassB ; 

    //...various code, not important 
} 

@RunWith(MockitoJUnitRunner.class) 
public class ProfileDALLOMImplTest { 

    @InjectMocks 
    private ProfileDALLOMImpl profileDALLOMImpl = new ProfileDALLOMImpl(); 

    @Mock 
    private SomeClass someClassA; 
    @Mock 
    private SomeClass someClassB; 

    private SomeResult mockSomeResult = mock(SomeResult.class); 

    @Test 
    public void testSomeMethod() { 
     when(someClassA .getSomething(any(SomeArgment.class)).thenReturn(mockSomeResult); 
     Int result = profileDALLOMImpl.someTest(This isn't relevant); 
    } 

} 
+0

はどのようにテストコードは次のように見えますか?私は常にMockito.mock(SomeClass.class)を明示的に呼び出して私のモックを作成し、単体テストからアノテーションによって提供される魔法を除外します。依存関係をコンストラクターまたはセッターを介して注入する場合、同じことができるはずです。それが事実でない理由がありますか? – rcomblen

+0

@InjectMocksを使用せずにこれらの依存関係を注入することができますか?私は自分のテストがどのようにセットアップされているかを示すためにQを更新しました。 – tamuren

答えて

0

アノテーションを使用しない場合、あなたはあなたのオブジェクトではなく、コンストラクタを介して指定の依存関係を持っている場合は、ちょうど同じことを行うことができます

public class MyClass { 
    private MyDependency myDependency; 

    public void setMyDependency(MyDependency myDependency){ 
     this.myDependency = myDependency; 
    } 
} 

import org.junit.Before; 
import org.junit.Test; 

import static org.mockito.Mockito.*; 

public class MyTest { 

    private MyClass myClass; 
    private MyDependency myDependency; 

    @Before 
    public void setUp(){ 
     myClass = new MyClass(); 
     myDependency = mock(MyDependency.class); 
     myClass.setMyDependency(myDependency); 
    } 

    @Test 
    public void test(){ 
     // Given 

     // When 

     // Then 
    } 
} 

のような何かを得ますセッター経由よりも。あなたの依存性注入フレームワークは、あなたがプライベートフィールドに注釈を付けるのと同じ方法で設定者に注釈を付けることができると思いますが、今はあなたのテストは依存性注入フレームワークに依存しません。

+0

私は依存性注入フレームワークを使って無視できません。それは私の手にないデザインの決定です。 – tamuren

9

私はJUnitを使ってMockito 1.9.5で同じタイプの2つのオブジェクトを嘲笑しようとしました。

参照:DOCからhttp://static.javadoc.io/org.mockito/mockito-core/1.9.5/org/mockito/InjectMocks.html

関連する型情報:

「フィールド注入;同じタイプのいくつかのプロパティがある場合、モックは最初の試合で、その後、種類によって解決されますフィールド名とモック名。 "

そして、あなたはあなたが同じタイプの2つを持っているときモック名は、すべてのモックのフィールド名を一致させる必要があると言っているようだ、この1:

は、「注1:あなたは、同じタイプのフィールドを持っている場合(または同じ消しゴム)の場合は、@Mockの注釈付きフィールドに一致するフィールドを付ける方が良いでしょう。さもなければ、Mockitoは混乱し、注入は起こりません。

おそらくこの後者はあなたを噛んでいますか?

1

は同じようにすぐに私は嘲笑クラスのいずれかを削除して、Splonkを指摘し、それがMockito 1.9.5でそのようにどのような作品を確認し、それが失敗しました。

だから、あなたの場合には、必ずあなたのテストでクラスと同じ名前を持つ嘲笑クラスの両方を持っています

@Mock 
private SomeClass someClassA; 
@Mock 
private SomeClass someClassB; 
関連する問題