Исключение NullPointer при попытке юнит-теста с использованием SpringRunner - PullRequest
0 голосов
/ 28 марта 2019

Привет. Я пытаюсь запустить мой модульный тест, используя 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 и выдает исключение nullPointerException при попытке протестировать метод.

Я просто не уверен, почему Autowire не связывает созданную мной зависимость.Я пытался использовать @Primary, чтобы явно использовать этот jdbcTemplate при необходимости, но не уверен, почему он не работает.

Любые предложения здесь полезны.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Я вижу много факторов, которые могут быть причиной:

  • Ваш класс "ClassToTest" не является службой / компонентом Spring, автоматическое подключение не может работать. Почему вы не аннотируете это @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 голосов
/ 29 марта 2019

Вы используете аннотацию @InjectMocks на тестируемом объекте, но вы ничего не дразните, вместо этого вы хотите загрузить контекст Spring и вставить в него bean-компонент jdbcTemplate.Попробуйте заменить @InjectMocks на @Autowired в ClassToTest и удалите поле jdbcTemplate.Bean-компонент jdbcTemplate должен быть инициализирован в Config и автоматически подключен к ClassToTest.Также вы можете указать класс Config в @ContextConfiguration.Надеюсь, это поможет.

...