2013-03-18 106 views
8

我正在使用Mockito编写单元测试,而且我有问题嘲笑注入的类。问题是两个注入的类是相同的类型,并且只通过@Qualifier注释进行区分。如果我试图简单地模拟SomeClass.class,那么在我的测试中没有注入该模拟,并且该对象是null。我怎样才能嘲笑这些物体?用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)'来创建我的模拟,从而不用我的单元测试通过注释提供的任何魔法。如果通过构造函数或setter方法注入依赖关系,您应该也可以这样做。是不是有很好的理由? – rcomblen 2013-03-18 19:41:41

+0

您可以证明在不使用@InjectMocks的情况下注入这些依赖关系吗?我更新了我的Q来演示我的测试是如何建立的。 – tamuren 2013-03-18 20:04:35

回答

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

,如果你的对象已经通过构造函数中指定它的依赖,而你可以做一样的比通过二传手。我想你的依赖注入框架可以用注释私有字段的方式注释这些setters,但是现在你的测试不依赖任何依赖注入框架。

+0

我无法抗拒使用依赖注入框架。这不是我手中的设计决定。 – tamuren 2013-03-21 16:57:56

9

我试着用Mockito 1.9.5使用JUnit嘲笑两个对象的类型,它的工作原理。

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

从文档相关型号信息:

“字段注入;模拟考试将首先按类型来解决,那么,如果存在多个相同类型的属性,通过比赛字段名称和模拟名称“。

而这一次,这似乎说你应该做的模拟名称为所有的嘲笑匹配字段名称时,你有两个相同类型的:

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

也许这后一个咬你?

1

刚刚确认Splonk指出了什么,它在Mockito 1.9.5中的工作方式,只要我删除了一个模拟类,就失败了。

所以,你的情况,请确保您有两个嘲笑类具有相同名称的如在您的测试类:

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