我想使用 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/