尝试使用SpringRunner进行单元测试时出现NullPointer异常

问题描述 投票:0回答:2

嗨,我正在尝试使用SpringRunner.class运行我的单元测试。我正在我的测试类中为jdbcTemaplte创建一个新实例。我使用H2 DB进行单元测试,我可以使用jdbcTemplate实例来创建或更新表。它工作正常。但当它进入实际的类时,它的测试jdbcTemplate是null,它会抛出NullPointerException

以下是代码:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class MyClassTest {

@InjectMocks
private ClassToTest classToTest;

@Autowired
private JdbcTemplate jdbcTemplate;

@org.springframework.context.annotation.Configuration
static class Config {

    @Bean(name = "jdbcTemplate")
    public JdbcTemplate orderService() {
        BasicDataSource dataSourceConfig = new BasicDataSource();
        dataSourceConfig.setDriverClassName("org.h2.Driver");
        dataSourceConfig.setUrl("jdbc:h2:mem:db");
        dataSourceConfig.setUsername("someUserName");
        dataSourceConfig.setPassword("somePassword");

        return new JdbcTemplate(dataSourceConfig);
    }
}
@Before
public void setUp() throws Exception {
//Use the jdbcTemplate to create Queries in H2 which works fine.
}

}

class to test.Java

 public class ClassToTest{
    @Autowired
    JdbcTemplate jdbcTemplate;

   //someMethod in DAO using jdbcTemplate to make sql Operations.

}

ClassToTest中的JDBC模板为null,并在尝试测试方法时抛出nullPointerException。

我只是不确定为什么Autowire没有连接我创建的依赖。我曾尝试使用@Primary在必要时明确地使用此jdbcTemplate但不确定为什么它不起作用。

任何建议在这里都有帮助。提前致谢。

java spring nullpointerexception jdbctemplate springrunner
2个回答
1
投票

我看到许多因素可能是原因:

  • 您的类“ClassToTest”不是Spring服务/组件,autowire无法工作。你为什么不用@Component注释它?
  • Spring建议的好方法是将autowires放入构造函数中。

喜欢 :

@Component
public class ClassToTest {
    private JdbcTemplate template;

    @Autowired // Although it's not even required when you have only one constructor : it's by default autowired
    public ClassToTest(JdbcTemplate template) {
        this.template = template;
    }
}

试试这个,告诉我们什么有用。祝好运


0
投票

您正在测试的对象上使用@InjectMocks注释,但是您没有嘲笑任何东西,而是要加载spring上下文并将jdbcTemplate bean注入其中。尝试在ClassToTest上用@Autowired替换@InjectMocks并删除jdbcTemplate字段。应该在Config中初始化jdbcTemplate bean并将其自动装入ClassToTest。您还可以在@ContextConfiguration中指定Config类。希望能帮助到你。

© www.soinside.com 2019 - 2024. All rights reserved.