Cucumber报告写入日志时调用Scenario.log出现空指针异常
问题根因
空指针的核心原因是依赖注入(DI)容器给AssertHook和步骤定义类注入的TestContext不是同一个实例:
- 你在AssertHook的@Before方法中确实为当前类持有的testContext对象设置了Scenario实例,也能正常打印出Scenario ID,证明钩子逻辑本身执行正常
- 但步骤定义类中持有的testContext是DI容器创建的独立新实例,这个实例的scenario字段从未被赋值,默认值为null,调用
getScenario()时自然会抛出空指针。
你可以加一行打印验证:分别在AssertHook的before方法、步骤方法中打印testContext对象的hashCode,两个输出值一定不相等,即可实锤多实例问题。
解决方案
按以下两个点修改即可解决问题:
将TestContext配置为DI容器的全局单例组件
如果你用Cucumber默认集成的PicoContainer做依赖注入,直接给TestContext类添加@Singleton注解即可,注解包为javax.inject.Singleton,修改后TestContext类的开头如下:import javax.inject.Singleton; @Singleton // 告知DI容器全局仅维护一个TestContext实例,所有注入点共享同一个对象 public class TestContext { // 原有类代码保持不变 }如果你用Spring集成Cucumber,给TestContext添加
@Component注解即可(Spring默认Bean作用域为单例)。调整@Before钩子执行优先级,确保Scenario最先完成赋值
给AssertHook中的@Before注解添加order参数,让这个钩子优先于所有其他业务钩子执行,避免其他前置逻辑提前调用scenario对象触发空指针:// order值越小执行优先级越高,设置为0保证最先执行 @Before(order = 0) public void beforeScenario(Scenario scenario) { testContext.setScenario(scenario); System.out.println("GET Scenario " + testContext.getScenario().getId()); }
修改完成后重启验证,所有注入点拿到的都是同一个TestContext实例,scenario字段会在所有步骤执行前完成赋值,空指针问题即可解决。
内容的提问来源于stack exchange,提问作者DeepakVerma
相关产品推荐
相关产品推荐

