[英]How to mock behavior for Springockito mocks?
如果我在使用Springockito描述我的Spring上下文文件創建一個模擬在這里 ,我怎么嘲笑為它的一些行為?
我正在嘗試做什么:
在沒有使用Springockito(直接使用Mockito)的情況下這樣做是直截了當的,但我需要自動裝配這些bean並在我的測試中使用Spring。 任何幫助表示贊賞。
請注意,新的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
}
}
這將導致在主應用程序上下文初始化時用mock替換ClassB。
我對Springockito並不熟悉,但對於一些狹隘的案例來說它看起來很有趣 - 即集成測試只是一點點嘲弄。
無論如何,對於一個簡單的用例,你可以擴展AbstractJUnit4SpringContextTests ,你也可以在你的測試中自動裝配ClassB,就像在ClassA中一樣。 然后,您可以在setup方法中定義ClassB的預期行為。
但我認為您需要在設置方法中訪問它之前為ClassB bean設置一些行為。 在這種情況下,您可能需要另一個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是不是更容易?
對我有用的是使用@InjectMocks表示法。 (見https://bitbucket.org/kubek2k/springockito/wiki/Home )
@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 @InjectMocks
private ClassB classB;
@Test
public void testClassA() {
// stub B
when(classB.foo()).thenReturn(true);
when(classB.bar()).thenReturn(42);
// test A
classA.doSomethingThatInternallyCallClassBFoo();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.