当前位置: 首页 > 知识库问答 >
问题:

Spring配置-注入模拟bean

章锦
2023-03-14

spring日志中的info消息显示:
跳过[BeanMethod:name=bar,declaringclass=test.package.mockitoTestConfiguration]的bean定义:bean“bar”的定义已经存在。这个顶级bean定义被认为是重写。

示例:
下面有一个简单的示例,可以使用。这里,Bar是嵌套在Foo内部的,我需要模拟Bar进行测试:

@Component
public class Foo
{
    @Autowired
    private Bar bar;

    public String getResponseFromBar(String request)
    {
        String response = bar.someMethod(String request);
        //do something else with this reponse
        return response;
    }

} 

@Component
public class Bar {
    public String someMethod(String request) {
        String response = null;
        //do something
        return response;
    }
}

现在对于测试来说,假设我想注入一个mockbar而不是真正的bar。我如何在下面的测试类中实现这一点?

@Profile("test")
@Configuration
public class MockitoTestConfiguration {

    //adding the name attribute is important.
    @Bean(name="mockBar")
    @Primary 
    public Bar bar() {
        logger.debug("injecting mock bar");
        return Mockito.mock(Bar.class);
    }
}

实际测试用例:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath*:test-context.xml")

public class FooTest {

    @Autowired
    Foo foo;
    @Autowired
    Bar mockBar; //need this to set up the mock response in the test case.

    @Test
    public void testAMethodInFoo_WithBarInjectedByMockito() {

        //set up the mockBar response
        Mockito.when(mockBar.someMethod("1")).thenReturn("1-response");

        String response = foo.getResponseFromBar();
        assertEquals("1-response", response);
    }
}

共有1个答案

申屠宗清
2023-03-14

根据ConfigurationClassBeanDefinitionReader代码,我想您正在使用xml配置来定义主bean。如果是这样,只需在创建mockito bean时添加一个名称。

@Bean(name="mockbar") 
@Primary 
public Bar bar() {
    logger.debug("injecting mock bar");
    return Mockito.mock(Bar.class);
}

这样,Spring将允许您同时拥有这两个bean,并且当您使用@primary时,它将是您的测试所使用的bean。

使用非主bean重写主bean的Spring

 类似资料:
  • 问题内容: 我想将Mockito模拟对象注入到Spring(3+)bean中,以进行JUnit的单元测试。我的bean依赖项当前是通过在私有成员字段上使用注释来注入的。 我考虑过使用,但是我希望注入的bean实例实际上是一个代理,因此没有声明目标类的私有成员字段。我不希望为依赖项创建一个公共的setter,因为我将纯粹出于测试目的而修改接口。 我遵循了Spring社区提供的一些建议,但是未创建该模

  • 我正在使用Spring boot测试(通过JUnit4和Spring MockMvc)REST服务适配器。适配器只需将向其发出的请求传递给另一个REST服务(使用自定义的RestTemplate),并将附加数据附加到响应中。 我想运行测试来执行控制器集成测试,但想用模拟覆盖控制器中的,以允许我预定义第三方REST响应并防止它在每次测试中被击中。我已经能够通过实例化一个并将其传递给要测试的控制器,该

  • 我正在将旧的xml/java配置转换为纯java配置。在xml中,我将参数注入配置文件,如下所示: 是否可以在爪哇配置中注入参数?(无需使用自动布线! 编辑:使用@Import,我看不到任何将参数注入SpringRestConfiguration的机会

  • 1. 前言 上一节,我们通过 xml 文件的配置方式,实现了对多种依赖类型的注入,当然体会到了 xml 文件配置方式的弊端:有一点麻烦。 依赖注入是有两种方式,一种是 xml ,另外一种就是注解的配置方式。 本节,我们演示下通过注解配置这种方式来实现注入依赖。 来吧 ,直入主题,莫浪费大好光阴… 2. 工程实例 2.1 注解的介绍 在正式使用注解之前,我们首先介绍下注解语法以及它的作用。 @Aut

  • 问题内容: 我有以下代码: 我想使用Mockito创建一个测试。我编写了如下测试: 我在网上收到NullPointerException: ,它表示“策略”列表已初始化,但为空。Mohito有什么办法可以像Spring一样浪费时间?是否将所有实现接口“策略”的实例自动添加到列表中? 顺便说一句,我在Wrapper类中没有任何二传手,如果可能的话,我想以这种方式离开。 问题答案: Mockito不知

  • 我正在为一个引用硬编码文件名“classpath:config.properties”的应用程序编写测试。无法更改此名称。有没有办法用不同的配置测试这个应用程序?i、 e.不同的测试在运行时提供不同的配置? 这是一个奇怪的要求,但我非常感谢任何意见