在 Spring Boot 2 中测试组件时的空指针

Posted

技术标签:

【中文标题】在 Spring Boot 2 中测试组件时的空指针【英文标题】:Nullpointer when testing components in springBoot 2 【发布时间】:2020-02-23 16:42:27 【问题描述】:

我有一个带有这个组件的 SpringBoot 2 应用程序

@Component
@Slf4j
public class RequestHostelUtils 

    private RequestHostelUtils() 
        // Private constructor to hide the implicit public one
    

还有这个

@Component
public class RequestEntityPredicates 

    private final RequestHostelUtils requestHostelUtils;

    public RequestEntityPredicates(RequestHostelUtils requestHostelUtils) 
        this.requestHostelUtils = requestHostelUtils;
    

还有这个单元测试,当我测试它时,我在 requestEntityPredicates 中添加了一个空指针,因为 requestHostelUtils 为空;

@RunWith(MockitoJUnitRunner.class)
@Slf4j
    public class RequestEntityValidatorsTests 

        @Autowired
        private RequestHostelUtils requestHostelUtils;

        private RequestEntityPredicates requestEntityPredicates;



    @Before
    public void setUp() throws Exception 
        requestEntityPredicates = new RequestEntityPredicates(requestHostelUtils);
    

我也试过了

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes =  Application.class )
@Slf4j
 public class RequestEntityValidatorsTests 

结果相同

【问题讨论】:

你正在使用MockitoJunitRunner 运行你的课程,它对 Spring 一无所知。因此不会注入任何东西。 【参考方案1】:

将 bean 加载到 Spring 中:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes =  RequestHostelUtils.class, RequestEntityPredicates.class )
@Slf4j
public class RequestEntityValidatorsTests  

【讨论】:

【参考方案2】:

你忘了自动装配你的 Bean。像这样将@Autowired 添加到您的ctor:

@Component
public class RequestEntityPredicates 

    private final RequestHostelUtils requestHostelUtils;

    @Autowired
    public RequestEntityPredicates(RequestHostelUtils requestHostelUtils) 
        this.requestHostelUtils = requestHostelUtils;
    

【讨论】:

别这么认为,因为我用的是构造函数注入

以上是关于在 Spring Boot 2 中测试组件时的空指针的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2 + Junit 5:带有@Value 的空值

从 cmd 运行时的 Spring Boot 负载测试数据库

使用Spring BOOT集成测试JPA存储库时的NoSuchMethodError(getMetaModel)

在 Spring Boot 测试中为组件扫描配置基础包

关闭与mysql和spring boot的ssl连接时的静音异常

如何在 Spring Boot 测试中加载仅添加命名组件的基本 Spring Application-Context?