如何模拟Springockito模拟的行为?

时间:2012-06-21 02:44:14

标签: java spring mocking mockito springmockito

如果我按照here所述使用Springockito在我的spring上下文文件中创建一个mock,我该如何为它模拟一些行为?

我正在尝试做什么:

  1. 正在测试ClassA。
  2. ClassB在ClassA中自动装配。
  3. ClassB正在被Springockito嘲笑。
  4. ClassA需要ClassB在其PostConstruct中执行某些操作。
  5. 我需要模拟ClassB才能做到这一点,因为它不能也不应该真的这样做。
  6. 在不使用Springockito(直接使用Mockito)的情况下直接执行此操作,但我需要自动装配这些bean并在我的测试中使用Spring。任何帮助表示赞赏。

3 个答案:

答案 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();
}

}