当前位置:  开发笔记 > 编程语言 > 正文

Spring中的单元测试:将依赖项注入正在测试的组件中

如何解决《Spring中的单元测试:将依赖项注入正在测试的组件中》经验,为你挑选了1个好方法。

我有一个非常简单的休息控制器:

@RestController
public class MyController {
    @Autowired
    public Logger logger;

通过以下配置注入记录器依赖项:

@Configuration
public class MyConfig {
    @Bean
    public Logger logger() {
        return LoggerFactory.getLogger(MyController.class);
    }

如果我运行包含控制器的Spring应用程序,那么一切正常.但是,在运行单元测试时,我无法设法实现此依赖注入.在这种情况下,我有以下测试配置:

@Configuration
@Profile("test")
public class MyTestConfig {
    @Bean
    public Logger logger() {
        return LoggerFactory.getLogger(MyCOntroller.class);
    }

这是我的单元测试代码的相关部分:

@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration(classes = MyTestConfig.class)
@ActiveProfiles("test")
public class MyContollerTest {

但是,记录器对象没有"自动装配" MyController(请注意,我不想模拟记录器对象),这会导致空指针引用.

我错过了什么?



1> JB Nizet..:

单元测试不应使用任何Spring配置.您应该简单地实例化您的组件,并手动注入依赖项(通常是假的).

你使用了现场注入,这让它变得有点困难.使用构造函数注入,您需要做的就是

Logger logger = LoggerFactory.getLogger(MyController.class);
MyController controller = new MyController(logger);

可以的Mockito帮助注射假依赖于你,虽然,使用字段注入,由于即使@Mock,@Spy@InjectMocks注解:

@Spy
private Logger logger = LoggerFactory.getLogger(MyController.class);

@InjectMocks
private MyController controller;

@Before
public void prepare() {
    MockitoAnnotations.initMocks(this);
}

也就是说,如果我没有弄错,你就不会使用@RunWith(SpringJUnit4ClassRunner.class),所以你的测试运行器对Spring一无所知,因此不会创建或使用任何Spring配置.


是的,'SpringJUnit4ClassRunner`是真正的罪魁祸首,imo.这更像是集成而不是单元测试.
推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有