11

我正在使用 Mockito 编写单元测试,但在模拟注入的类时遇到了问题。问题是两个注入的类是相同的类型,并且仅通过它们的@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 模拟两个具有相同类型的对象,并且它可以工作。

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

文档中的相关类型信息:

“字段注入;mock首先通过类型解析,如果有多个相同类型的属性,则通过字段名称和mock名称的匹配。”

这似乎是说当您有两个相同类型时,您应该使模拟名称与所有模拟的字段名称匹配:

“注意1:如果你有相同类型(或相同擦除)的字段,最好@Mock用匹配的字段命名所有带注释的字段,否则Mockito可能会混淆并且不会发生注入。”

也许后者在咬你?

于 2013-05-26T21:16:59.903 回答
2

刚刚确认了 Splonk 指出的内容,它在 Mockito 1.9.5 中以这种方式工作,一旦我删除了一个模拟类,它就失败了。

因此,在您的情况下,请确保您的两个模拟类与测试中的类同名:

@Mock
private SomeClass someClassA;
@Mock
private SomeClass someClassB;
于 2016-08-22T23:05:22.203 回答
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
    }
}

如果您的对象通过构造函数而不是通过 setter 指定其依赖项,您也可以这样做。我猜您的依赖注入框架可以像注释私有字段一样注释设置器,但是现在您的测试不依赖于任何依赖注入框架。

于 2013-03-18T20:22:35.847 回答