java - 将mock注入(inject)Spring容器中,无需xml进行测试

标签 java spring mocking mockito

目前,我使用 @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>

test-applicationContext.xml 在 @ContextConfiguration 注释中声明,因此 Foo 最终将依赖于模拟的 Bar 对象。

无需此 test-applicationContext.xml 是否可以获得相同的结果?即以编程方式执行相同的操作?

所以在伪代码中,我想知道是否可以有类似的东西:

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
    }
}

最佳答案

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

尽管如此,它可以通过以下方式完成:

  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 注入(inject) JUnit 即可获取工厂

关于java - 将mock注入(inject)Spring容器中,无需xml进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5935086/

相关文章:

java - 以下 JAVA 谓词的语法

java - 表示 Enum 的列使用哪种数据类型?

java - Spring Security 通过 session ID 获取登录用户

java - 配置spring security后出现未授权调用

java - 如何使用 MockRestServiceServer 测试 RestClientException

.net - 模拟和验证对包含 Expression<Func<T,bool>> 参数的方法的调用

java - 捕获异常

使用 Int 的 Java jSF NamedQuery

php - 在没有API的情况下如何测试客户端?

java - 当我编译时,我不断收到此错误消息 '.class' Expected for this line this.hand = Card[] hand;我不知道该怎么做才能改变它