Java 将mock注入到Spring容器中而不使用xml进行测试

Java 将mock注入到Spring容器中而不使用xml进行测试,java,spring,mocking,mockito,Java,Spring,Mocking,Mockito,目前,我使用@Autowired、@Component、@Resource等连接了我的spring应用程序。现在我想编写一个测试,要求模拟系统中的特定对象,但保留剩余对象的实际生产连接 假设正在测试的根对象称为Foo。在依赖链的更深处,Foo依赖于Bar。目前为了模拟这个对象,我创建了一个test-applicationContext.xml,它只有一个bean条目: <bean id="bar" class="org.mockito.Mockito" factory-method="mo

目前,我使用@Autowired、@Component、@Resource等连接了我的spring应用程序。现在我想编写一个测试,要求模拟系统中的特定对象,但保留剩余对象的实际生产连接

假设正在测试的根对象称为Foo。在依赖链的更深处,Foo依赖于Bar。目前为了模拟这个对象,我创建了一个test-applicationContext.xml,它只有一个bean条目:

<bean id="bar" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="com.package.Bar" /> 
</bean>

您必须避免在单元测试中启动Spring上下文。仅在检查属性注入和其他Spring功能的测试中使用Spring上下文。然后,您将能够以编程方式创建模拟对象

尽管如此,它可以通过以下方式实现:

public class MyTest {

    @Test
    public void simple() {
        // create mock Bar object
        // register mock Bar object in container
        // resolve Foo object with all its dependencies but use the mock Bar object instead of the real one
        // set some expectations on the Bar object
        // call some method on Foo
    }
}
  BeanDefinitionRegistry registry = ((BeanDefinitionRegistry )factory);

  GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
  beanDefinition.setBeanClass(MyBeanClass.class);
  beanDefinition.setLazyInit(false);
  beanDefinition.setAbstract(false);
  beanDefinition.setAutowireCandidate(true);
  beanDefinition.setScope("session");

  registry.registerBeanDefinition("dynamicBean",beanDefinition);
只需将BeanFactory注入JUnit中,就可以通过一种方式获得工厂:

  • 在测试上下文中,组件扫描最小值

  • @将Bar的依赖项自动关联到测试类中

  • 在您的设置中:

  • 手动
    newbar()

  • 创建Foo的模拟

  • 设置新条的属性,包括@Autowired(第一个#2)和mock(第二个#2)


  • 我有一个非常类似的问题,并用它真的对我有益

    在您的情况下,如果您想要完全模拟,那么可以使用@ReplaceWithMock,或者您可以使用@WrapWithSpy,它将执行部分模拟,并且只有您可以模拟要更改其行为的函数