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

时间:2019-03-28 20:16:48

标签: java spring nullpointerexception jdbctemplate springrunner

嗨,我正在尝试使用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.
}

}

ClassToTest.java

 public class ClassToTest{
    @Autowired
    JdbcTemplate jdbcTemplate;

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

}

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

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

这里有任何建议都是有帮助的。提前谢谢。

2 个答案:

答案 0 :(得分:0)

您正在对要测试的对象使用@InjectMocks批注,但您并未在模拟任何东西,而是希望加载spring上下文并将jdbcTemplate bean注入其中。尝试在ClassToTest上将@InjectMocks替换为@Autowired并删除jdbcTemplate字段。 jdbcTemplate bean应该在Config中初始化,并自动连接到ClassToTest。另外,您可能想在@ContextConfiguration中指定Config类。希望对您有所帮助。

答案 1 :(得分:0)

我发现可能有许多因素:

  • 您的类“ ClassToTest”不是Spring服务/组件,因此自动装配无法工作。为什么不使用@Component对其进行注释?
  • 使用Spring建议的良好做法,将自动装配放入构造函数中。

赞:

@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;
    }
}

尝试一下,告诉我们有效的方法。祝你好运