如果我按照here所述使用Springockito在我的spring上下文文件中创建一个mock,我该如何为它模拟一些行为?
我正在尝试做什么:
在不使用Springockito(直接使用Mockito)的情况下直接执行此操作,但我需要自动装配这些bean并在我的测试中使用Spring。任何帮助表示赞赏。
答案 0 :(得分: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在主应用程序上下文初始化时被mock替换。
答案 1 :(得分:2)
我对Springockito并不熟悉,但对于一些狭隘的案例看起来很有趣 - 即集成测试只是嘲笑一下。
无论如何,看起来对于扩展AbstractJUnit4SpringContextTests的简单用例,您也可以像在ClassA中一样在测试中自动装配ClassB。然后,您可以在设置方法中定义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是不是更容易?
答案 2 :(得分:0)
对我有用的是使用 @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) 公共类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();
}
}