2014-09-26 72 views
4

我正在使用Mockito 1.9.5來執行一些單元測試。我試圖注入具有專用接口字段的類的具體類模擬。這裏有一個例子:我Mockito:將類模擬注入到專用接口字段

類正在測試

@Component 
public class Service { 

    @Autowired 
    private iHelper helper; 

    public void doSomething() { 
     helper.helpMeOut(); 
    } 
} 

我的測試該類

@RunWith(MockitoJUnitRunner.class) 
public class ServiceTest { 

    @Mock 
    private iHelper helper; 

    @InjectMocks 
    private Service service; 

    @Before 
    public void setup() { 
     service = new Service(); 
    } 

    @Test 
    public void testStuff() { 
     doNothing().when(helper).helpMeOut(); 
     service.doSomething(); 
    } 
} 

此代碼拋出試圖調用helper.helpMeOut當一個NullPointerException()在doSomething()中。我運行測試時調試並發現helper爲null。我也嘗試將iHelper更改爲具體的Helper類,並且發生了同樣的問題。

有什麼建議嗎?我如何讓Mockito正確地將模擬注入到接口專用字段中?

+1

你在做什麼是完全正確的。這應該是可行的。事實上,它適用於我;我經常使用這種方法。如果您想讓真正的Mockito專家看到它,您可以嘗試將其發佈到Mockito用戶列表中。 – 2014-09-26 23:15:55

+0

你爲什麼不把'helper'field可見性更改爲默認值?我猜這個服務和它的測試是一樣的。 – ponomandr 2014-09-27 00:02:28

+0

@ponomandr這沒有幫助。 '@InjectMocks'代碼有一些反射魔法,它允許它設置私有字段。 – 2014-09-27 00:04:23

回答

5

@ acdcjunior的評論幫我找出問題。使用new關鍵字實例化服務會導致Spring無法正確注入依賴關係(本例中爲helper)。我在測試中通過自動裝配來解決這個問題。我最後的工作代碼看起來是這樣的:我

類正在測試

@Component 
public class Service { 

    @Autowired 
    private iHelper helper; 

    public void doSomething() { 
     helper.helpMeOut(); 
    } 
} 

我的測試該類

@RunWith(MockitoJUnitRunner.class) 
public class ServiceTest { 

    @Mock 
    private iHelper helper; 

    @InjectMocks 
    @Autowired 
    private Service service; 

    @Test 
    public void testStuff() { 
     doNothing().when(helper).helpMeOut(); 
     service.doSomething(); 
    } 
} 

希望這可以幫助其他人。感謝您的建議!

2

根據the docs,您缺少設置。

@Before 
public void initMocks() { 
    MockitoAnnotations.initMocks(this); 
} 

編輯*

採取的看看這個頁面why you should not use @InjectMock to autowire fields

+4

實際上,如果我使用@RunWith(MockitoJUnitRunner.class)註釋,則不需要:http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/runners/MockitoJUnitRunner.html – zongweil 2014-09-26 23:54:27

+2

正如@zongweil所說,如果你使用'@RunWith(MockitoJUnitRunner.class)',那麼'initMocks'就會被調用。所以這個答案是不正確的。 – 2014-09-27 00:03:33

+0

你說得對,對不起。然後我發現。希望它有效! – 2014-09-27 05:49:09