11

Mockito を使用して単体テストを書いていますが、注入されたクラスのモックに問題があります。問題は、注入された 2 つのクラスが同じ型であり、それらの@Qualifier注釈によってのみ区別されることです。単にモックしようとするとSomeClass.class、そのモックは注入されず、そのオブジェクトはnullテストに含まれます。これらのオブジェクトをモックするにはどうすればよいですか?

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

 }
4

3 に答える 3

10

JUnitを使用してMockito 1.9.5で同じタイプの2つのオブジェクトをモックしようとしましたが、うまくいきました。

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

ドキュメントからの関連する型情報:

「フィールド注入。モックは最初に型によって解決されます。次に、同じ型のプロパティが複数ある場合は、フィールド名とモック名の一致によって解決されます。」

そして、これは、同じタイプのモックが2つある場合、すべてのモックのフィールド名と一致するモック名を作成する必要があると言っているようです:

「注 1: 同じタイプ (または同じ消去) のフィールドがある場合は、すべての@Mock注釈付きフィールドに一致するフィールドの名前を付けることをお勧めします。そうしないと、Mockito が混乱してインジェクションが発生しない可能性があります。」

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

于 2013-05-26T21:16:59.903 に答える
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
    }
}

オブジェクトの依存関係がセッターではなくコンストラクターを介して指定されている場合も、同じことができます。依存性注入フレームワークは、プライベート フィールドに注釈を付けるのと同じ方法でセッターに注釈を付けることができると思いますが、現在、テストは依存性注入フレームワークに依存していません。

于 2013-03-18T20:22:35.847 に答える