嗨,我正在尝试使用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但不确定为什么它不起作用。
任何建议在这里都有帮助。提前致谢。
我看到许多因素可能是原因:
喜欢 :
@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;
}
}
试试这个,告诉我们什么有用。祝好运
您正在测试的对象上使用@InjectMocks注释,但是您没有嘲笑任何东西,而是要加载spring上下文并将jdbcTemplate bean注入其中。尝试在ClassToTest上用@Autowired替换@InjectMocks并删除jdbcTemplate字段。应该在Config中初始化jdbcTemplate bean并将其自动装入ClassToTest。您还可以在@ContextConfiguration中指定Config类。希望能帮助到你。