2013-03-18 103 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;