java - 如何在 @Configuration/@Bean 使用的单元测试中禁用 Spring Autowiring

标签 java spring junit mockito spring-test

我想使用 spring-test 配置内部类 (@Configuration) 配置组件测试。测试的组件有一些我想为测试模拟的服务。这些服务是类(不使用接口(interface))并在其中具有 Spring 注释(@Autowired)。 Mockito 可以轻松地模拟它们,但是,我发现无法禁用 Spring Autowiring 。

我如何轻松复制的示例:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SomeTest.Beans.class)
public class SomeTest {

    // configured in component-config.xml, using ThirdPartyService
    @Autowired
    private TestedBean entryPoint;

    @Test
    public void test() {
    }

    @Configuration
    @ImportResource("/spring/component-config.xml")
    static class Beans {
        @Bean
        ThirdPartyService createThirdPartyService() {
            return mock(ThirdPartyService.class);
        }
    }
}

public class ThirdPartyService {
    @Autowired
    Foo bar;
}

public class TestedBean {
    @Autowired
    private ThirdPartyService service;
}

在本例中,“TestBean”代表要模拟的服务。我不希望在 Spring 注入(inject)“酒吧”! @Bean(autowire = NO) 没有帮助(事实上,这是默认值)。 (请从“使用接口(interface)!”评论中拯救我 - 模拟服务可以是我无法做任何事情的第 3 方。)

更新

Springockito 部分解决了这个问题,只要您不需要配置其他任何东西(因此您不能将配置类与 Springockito 一起使用 - 它不支持它),但只能使用模拟。 还在寻找纯 Spring 解决方案,如果有的话……

最佳答案

这是我对您的问题的解决方案:

import static org.mockito.Mockito.mockingDetails;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MockitoSkipAutowireConfiguration {

@Bean MockBeanFactory mockBeanFactory() {
    return new MockBeanFactory();
}

private static class MockBeanFactory extends InstantiationAwareBeanPostProcessorAdapter {
    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        return !mockingDetails(bean).isMock();
    }
}

} 

然后只是

@Import(MockitoSkipAutowireConfiguration.class)

在您的测试中 @Configuration 一切就绪

关于java - 如何在 @Configuration/@Bean 使用的单元测试中禁用 Spring Autowiring ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26016311/

相关文章:

java - JMock:预期一次,从未调用

java - 有没有办法在 Java 中创建另一个对象的集合(类似 LINQ)?

java - 如何使用 snmp4j 发送带有 enginedId 的 v3 陷阱

java - 未将 JAX-RS 自定义 header 添加到重定向响应

java - 在 Junit 中扩展 ParentRunner

java - 当我的 JUnit 测试从 Ant 运行时 getPackage() 返回 null

java - 伪代码非极大值抑制

java - Spring MVC项目代码更改后不响应浏览器请求

java - 为什么我在包中缺少最后一级目录时却可以编译它?

java - 没有 Spring Security 的 Spring Java 登录