2014-03-12 42 views
2
的Mockito

這裏的問題:我有一個相當複雜的類,有很多在它定義的@Inject(其中一類Ç)。這個類的一個實例被注入到另一個類A,我想要測試它。 這個想法是,我想注入B類的模擬到A - 我希望它被Spring注入,以便在實例創建後執行init方法(因此沒有@InjectMock這裏有替代注射劑)。測試春:避免注射到嘲笑的對象與

Here's an example that is boiled down to three classes Bla, Blub and Blublub。我想要做的是模擬Blub並將此實例注入到BlubBlub - 我想忽略Bla的存在。

* 編輯 *

主要的一點是,我希望有一個背景下由類咕嚕咕嚕的模擬和類BlubBlub的一個實例。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = MockInjectionTest.TestApp.class) 
public class MockInjectionTest { 
@Inject 
public Blub blub; 

@Inject 
public BlubBlub blubblub; 

@Configuration 
public static class TestApp { 
    @Bean 
    Blub getBlub() { 
     return mock(Blub.class); 
    } 

    @Bean 
    BlubBlub getBlubBlub() { 
     return new BlubBlub(); 
    } 
} 

@Test 
public void testBlub() { 
    Assert.assertNotNull(blub); 
} 

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

// the classes 
public static class Bla { 
} 

public static class Blub { 
    @Inject 
    public Bla bla; 
} 

private static class BlubBlub { 
    @Inject 
    public Blub blub; 
} 
} 

問題:當我或者通過使用@Mock或致電模擬(泡殼),明確在@Bean方法我收到以下錯誤時ApplicationContext被實例化(無論我定義咕嚕的模擬使用xml-config或基於註解的bean定義)。

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating 
bean with name 'getBlub': Injection of autowired dependencies failed; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Could not autowire field: public Bla Blub.bla; 

所以顯然Spring仍然想要實例化原始類而不是僅僅使用我提供的實例。這是接下來創建上下文所必需的(如果我手動創建上下文,並使用已在上下文構建中轉儲的ctx.getBean()來拉豆。

來自Guice我會簡單地將我的模擬實例綁定到模塊中,一切都會好的。

幫助非常感謝 - 聽起來像一個標準問題,但我找不到一個簡單的解決方案。

感謝和問候,弗裏克

+0

這是一個遺憾,這一個沒有回答,我有同樣的問題 – john16384

回答

0

更改配置以

@Configuration 
public static class TestApp { 

@Bean 
Blub getBlub() { 
    return mock(Blub.class); 
} 

@Bean 
BlubBlub getBlubBlub() { 
    return new BlubBlub(); 
} 

@Bean 
Bla getBla() { 
    return mock(Bla.class) 
} 

} 

什麼春天抱怨的事實是,沒有布拉實施存在於應用程序上下文和那裏沒有注射可以進行

+0

嗨@geoand,感謝您的快速回復;我有這樣的想法,但假設我有十個這樣的Bla ** - 應該被注入的類,那麼我最終會得到一個龐大的「純」的樣板文件,這只是因爲Spring將事物引入上下文我不想在那裏。畢竟他們甚至沒有注入。我想要一個包含Blub類模擬和BlubBlub類實例的環境。也許這對於Spring來說是不可能的,並且這是堅持Guice的好處之一。 – fricke

+0

這是一個很好的問題。如果是這樣的話,你應該簽出像你習慣的@InjectMock一樣工作的Springockito項目。 http://stackoverflow.com/q/19354473/2504224 – geoand

+0

嗨@geoand,不幸的是,Springockito幫助解決了Spring的問題,同時爲所有「@Inject-ed」類構建上下文檢查,並在那裏中斷。 – fricke

0

你可以這樣返回一個空豆:

@Configuration 
public static class TestApp { 
    @Bean 
    Blub getBlub() { 
     return mock(Blub.class); 
    } 
    @Bean 
    Bla getBla() { 
     return null; 
    } 

    @Bean 
    BlubBlub getBlubBlub() { 
     return new BlubBlub(); 
    } 
} 

這將避免注入Bla實例,因爲沒有。 當你有很多@Injects時,這並不理想,但這是有效的。

另一個不理想的解決方案是讓你的bean實現一個接口,並模擬接口而不是實現類。

我試過springockito,這將適用於你的情況,但在我的測試用例之一是測試一個自定義的BeanDefinitionRegistryPostProcessor,這是在思考正常的春季行爲。