在 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)