12

我有一个 Spring XML bean 定义,我想为其编写集成测试。XML bean 定义是一个更大的应用程序上下文的一部分,其中包含几个这样的文件,使用<import>. 在定义中,我引用了几个来自其他文件的 bean。

对于我的集成测试,我想独立实例化定义,并对所有其他 bean 使用 Mockito 模拟。到目前为止,我正在使用这样的东西:

FooIntegrationTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class FooIntegrationTest {
  @Autowired private ClassUnderTest underTest;
  @Autowired private MockedClass mock;

  @Test
  public void testFoo() {
  }
}

FooIntegrationTest-context.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  <import resource="part-to-test.xml" />

  <bean id="mockedClassReferencedByName" class="org.mockito.Mockito" factory-method="mock" c:classToMock="SomeMockedClass" />
  <bean class="org.mockito.Mockito" factory-method="mock" c:classToMock="OtherMockedClassReferencedByType" />
  <bean class="org.mockito.Mockito" factory-method="mock" c:classToMock="MockedClass" />
  ...
</beans>

我想自动化相当乏味的模拟部分:理想情况下,我希望自动模拟在应用程序上下文中找不到的所有 bean。通过使用名称引用设置的part-to-test.xml用途和 bean。@Autowired我只使用 XML bean 定义文件,既不使用@Configuration类也不使用@Component注解。

我已经研究了如何在 中使用自定义上下文加载器@ContextConfiguration(loader=...),但我还没有找到合适的扩展点。Srinockito 似乎没有解决这个问题。

是否有其他项目已经解决了这个问题?如果没有,我将在哪里扩展 Spring 以自动创建模拟?

4

2 回答 2

6

这是一篇带有代码示例的简短文章。一个BeanDefinitionRegistryPostProcessor实现为每个缺少的 bean 定义生成一个模拟对象。生成部分是用 a 完成的MocksFactory,这里是这样一个工厂的例子

于 2012-04-24T07:27:28.077 回答
3

以防万一有人仍然对这个问题感兴趣,我已经扩展了 Yves Martin 提到的文章中的代码,包括继承、对@Inject 的支持等......并在这里创建了一个 Github 项目:https ://github.com/ rinoto/spring-auto-mock

于 2014-10-13T16:54:11.013 回答