2017-02-08 40 views
3

我有一個Spring啓動項目,它有一套單元測試,它使用mockito的@InjectMocks來實例化正在測試的類並注入可能存在的任何模擬。@Autowire結合@InjectMocks

換句話說,如果我有這樣的

@InjectMocks MyClass的MyClass的;

然後我不需要

MyClass的MyClass的=新MyClass的();
或 @Autowired MyClass myClass;

到目前爲止,這個設置工作正常。

但是最近有必要在運行測試時訪問項目的spring引導屬性。這意味着必須在測試中使用SpringBoot任務運行程序,以便任何@Autowire實例(包括實例化Environment類的實例)都可以工作。

我發現如果使用@InjectMocks來實例化一個類,那麼類中的@Autowired的任何實例都不起作用(它們應該創建的對象爲null)。這意味着沒有Environment類並且不能訪問Spring屬性。

相反,我必須@Autowired添加到@InjectMocks註釋

所以這

@InjectMocks MyClass的MyClass的;

成爲該

@Autowired
@InjectMocks MyClass的MyClass的;

我的問題很簡單。 這樣做有什麼問題嗎? 它是否實例化myClass或做任何可能導致故障的任何事情

回答

4

我認爲你在混合屬於春天和屬於Mockito的註釋。

當運行您的web應用程序時,@Autowired將爲您的類提供特定的依賴關係。這樣,您不必使用關鍵字new手動創建任何對象。但是在運行時,這只是彈簧註釋的作用。 mockito註釋不適用於此用例。

當你運行測試時,這是相反的。現在,Spring註釋將不會執行任何操作,這是正在運行的mockito註釋。 @InjectMocks會告訴mockito:「我提供的任何東西都是@Mock,這是這個班級所需要的,只要把它放在那裏」。即使您沒有在該字段上輸入@Autowired,它也會這樣做。 Mockito不關心春天的註釋。

對於你的問題:我沒有看到一個用例,你會把@Autowired和@InjectMocks放在同一個地方。在您的測試中使用應用程序邏輯中的spring註釋和mockito註釋。

我知道答案是相當抽象的,但你的問題也是如此。要獲得更具體的幫助,您應該提供a minimal, complete and verifiable example