我有一个非常简单的休息 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);

不过,由于 @Mock@Spy@InjectMocks 注释,Mockito 可以帮助您注入(inject)虚假依赖项,即使在使用字段注入(inject)时也是如此:
@Spy
private Logger logger = LoggerFactory.getLogger(MyController.class);

@InjectMocks
private MyController controller;

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

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

10-06 12:42
查看更多