1

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

}

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

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

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

4

2 回答 2

2

我看到许多可能导致的因素:

  • 您的类“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;
    }
}

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

于 2019-03-28T22:17:00.270 回答
2

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

于 2019-03-28T21:16:57.417 回答