jdbcTemplate является нулем, когда используется метод с JUnit - PullRequest
0 голосов
/ 30 июня 2019


В настоящее время я работаю над Spring Project и сейчас пишу тесты JUnit. Моя проблема в том, что jdbcTemplate является нулевым (проверено с помощью отладчика) в методе getQuestions, поэтому он не получает никаких данных из базы данных.
Все остальное работает просто отлично. Итак, вот мой код:

Я делаю это в начале класса контроллера:

@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}

@Autowired
private JdbcTemplate jdbcTemplate;

getQuestions:

@PostMapping("/question")
public List<String> getQuestions(@RequestBody int number){

    String query = "SELECT t.question " +
            "FROM question as t " +
            "ORDER BY RAND() " +
            "LIMIT " + number + ";";

    this.questionList = jdbcTemplate.queryForList(query, String.class);
    this.index = number;

    return questionList;
}

Я делаю это в начале теста класса:

private MockMvc mockMvc;

@InjectMocks
private MainController controller;

@Before
public void setUp() throws Exception {
    mockMvc = MockMvcBuilders.standaloneSetup(controller)
            .build();
}

И метод испытания:

@Test
public void getQuestions() throws Exception{
    int num = 4;

    mockMvc.perform(
            MockMvcRequestBuilders.post("/api/question")
                    .contentType(MediaType.APPLICATION_JSON_UTF8)
                    .content(asJsonString(num))
                    .accept(MediaType.APPLICATION_JSON_UTF8)
    ).andExpect(MockMvcResultMatchers.status().isOk());
}

Теперь я не знаю, как заставить jdbcTemplate не быть нулевым. Также в обычном приложении метод работает отлично.

Ответы [ 3 ]

0 голосов
/ 30 июня 2019

Мои application.properties выглядят так:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db_example
spring.datasource.username=springuser
spring.datasource.password=*****

Но все та же ошибка ...

0 голосов
/ 30 июня 2019

jdbcTemplate является нулевым, потому что mockMvc не может создать экземпляр и инициализировать MainController должным образом.

Эта строка вызывает проблему:

mockMvc = MockMvcBuilders.standaloneSetup(controller)
            .build();

public static StandaloneMockMvcBuilder standaloneSetup (Object ... controllers) Создайте экземпляр MockMvc, зарегистрировав один или несколько экземпляров @Controller и настроив SpringИнфраструктура MVC программно.Это позволяет полностью контролировать создание и инициализацию контроллеров и их зависимостей, аналогично обычным модульным тестам, а также позволяет тестировать один контроллер за раз.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/web/servlet/setup/MockMvcBuilders.html#standaloneSetup-java.lang.Object...-

Чтобы это исправить, вам нужно изменить свой класс Test:

удалить строки:

@InjectMocks
private MainController controller;

изменить метод setUp ():

private MockMvc mockMvc;

@Before
public void setUp() throws Exception {
    this.mockMvc = MockMvcBuilders.standaloneSetup(new MainController()).build();
}
0 голосов
/ 30 июня 2019

Вам необходимо настроить источник данных для тестовой среды. Если вы используете Spring Boot, попробуйте создать application.properties, расположенные в test / resources (Spring Boot сделает все остальное)

например, с базой данных h2

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

прочитать часть о свойствах источника данных в файле application.properties https://www.baeldung.com/spring-testing-separate-data-source а также Источник данных Spring Boot в модульных тестах

или если вы не используете Spring Boot, вам нужно настроить env для тестирования другим способом, это зависит от соглашений и правил в вашем проекте. Я думаю, в любом случае вам нужно найти конфигурацию базы данных для реальной установки (это будет bean-компонент dataSource и все связанные вещи) и попытаться эмулировать ее (добавьте TestConfiguration и подставьте туда все необходимые bean-компоненты (или используйте аннотацию @Mock)

...