gpt4 book ai didi

java - Spring 单元测试 : injecting a dependency into a component under test

转载 作者:搜寻专家 更新时间:2023-10-31 19:44:48 25 4
gpt4 key购买 nike

我有一个非常简单的休息 Controller :

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

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

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

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

@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 中没有“ Autowiring ”(请注意,我不想模拟记录器对象),这会导致空指针引用。

我错过了什么?

最佳答案

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

您使用了字段注入(inject),这使它变得有点困难。使用构造函数注入(inject),您需要做的就是

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

Mockito 可以帮助您注入(inject)虚假依赖项,即使在使用字段注入(inject)时,也要感谢 @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 配置。

关于java - Spring 单元测试 : injecting a dependency into a component under test,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34231426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com