2012-06-21 281 views
3

如果我在使用Springockito的彈簧上下文文件中創建一個模擬,如here所述,我該如何模擬一些行爲?如何模擬Springockito模擬行爲?

我想要做的事:

  1. ClassA的被測試。
  2. ClassB在ClassA中自動裝配。
  3. ClassB正在被Springockito嘲笑。
  4. ClassA需要ClassB在其PostConstruct中執行某些操作。
  5. 我需要嘲笑ClassB來做那件事,因爲它不能也不應該真的這樣做。

如果不使用Springockito(直接使用Mockito),這樣做很簡單,但我需要自動裝配這些bean,並在測試中使用Spring。任何幫助表示讚賞。

回答

2

我對Springockito並不熟悉,但它對於一些狹隘的情況看起來很有趣 - 即集成測試和嘲諷只是一點點。

無論如何,它看起來像是一個簡單的使用案例,您可以擴展AbstractJUnit4SpringContextTests,您也可以在您的測試中自動裝入ClassB,就像在ClassA中一樣。然後,您可以在您的設置方法中爲ClassB定義您的預期行爲。

但我認爲你需要爲ClassB bean設置一些行爲,然後才能在setup方法中訪問它。在這種情況下,您可能需要另一個bean來設置ClassB以執行預期的行爲。所以,你的testContext.xml會在它是這樣的:

<bean id="classA" class="com.jarvis.ClassA" depends-on="classBMockSetter" /> 
<mockito:mock id="classB" class="com.jarvis.ClassB" /> 
<bean id="classBMockSetter" class="com.jarvis.test.ClassBMockSetter"> 
    <property name="classB" ref="classB" /> 
</bean> 

的ClassBMockSetter看起來是這樣的:

public class ClassBMockSetter { 
    private ClassB classB; 
    public void setClassB(ClassB classB) { 
    this.classB = classB; 
    given(classB.foo()).willReturn(true); 
    given(classB.bar()).willReturn(42); 
    } 
} 

我認爲這工作,但在這一點上,是不是更容易只需手動編碼您的模擬ClassB?

+0

謝謝,那就是我正在尋找的。當你說手工編寫代碼時,代碼將在哪裏生存,因爲當ClassA在ClassATest中實例化時以及post構造方法被調用之前它需要被使用。 – JPL

3

注意,新springockito-annotations有助於達到同樣的目標,而不使用XML內容和額外的輔助類搞亂:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader = SpringockitoContextLoader.class, locations = "classpath:test-config.xml") 
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) 
public class MemoAutoTest extends AbstractJUnit4SpringContextTests { 

    @Autowired 
    private ClassA classA; 
    @Autowired @ReplaceWithMock 
    private ClassB classB; 

    @Test 
    public void testClassA() { 
     // stub B 
     when(classB.foo()).thenReturn(true); 
     when(classB.bar()).thenReturn(42); 

     // test A 
    } 

} 

這將導致ClassB的與在主應用程序上下文初始化模擬來代替。

+0

你能分享一下test-config.xml嗎? – Ika

0

我的工作是使用@InjectMocks表示法。 (參見https://bitbucket.org/kubek2k/springockito/wiki/Home

@RunWith(SpringJUnit4ClassRunner.class)來 @ContextConfiguration(裝載機= SpringockitoContextLoader.class,位置= 「類路徑:測試-config.xml中」) @DirtiesContext(classMode = DirtiesContext。 ClassMode.AFTER_CLASS) 公共類MemoAutoTest延伸AbstractJUnit4SpringContextTests時{

@Autowired 
private ClassA classA; 
@Autowired @InjectMocks 
private ClassB classB; 

@Test 
public void testClassA() { 
    // stub B 
    when(classB.foo()).thenReturn(true); 
    when(classB.bar()).thenReturn(42); 

    // test A 
    classA.doSomethingThatInternallyCallClassBFoo(); 
} 

}