繁体   English   中英

如何模拟Springockito模拟的行为?

[英]How to mock behavior for Springockito mocks?

如果我在使用Springockito描述我的Spring上下文文件创建一个模拟在这里 ,我怎么嘲笑为它的一些行为?

我正在尝试做什么:

  1. ClassA正在测试中。
  2. ClassB在ClassA中自动装配。
  3. ClassB正在被Springockito嘲笑。
  4. ClassA需要ClassB在其PostConstruct中做一些事情。
  5. 我需要模拟ClassB才能做到这一点,因为它不能也不应该真的这样做。

在没有使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM