用Mockito模拟两个相同类型的对象



我正在使用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);
    }
 }

我尝试用JUnit模拟两个具有相同类型的Mockito 1.9.5的对象,它工作。

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

来自文档的相关类型信息:

"字段注入;模拟将首先按类型解析,然后,如果有多个相同类型的属性,则按字段名和模拟名的匹配来解析。"

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

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

也许后者正在咬你?

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

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

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

如果不使用注释,就会得到类似

的内容
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指定的,也可以这样做。我猜你的依赖注入框架可以像注释私有字段一样注释setter,但现在你的测试不依赖于任何依赖注入框架。

相关内容

  • 没有找到相关文章

最新更新