Как проверить класс конфигурации Hibernate, аннотированный Java в SpringBoot, используя Mockito? - PullRequest
2 голосов
/ 19 марта 2019

Я работаю над проектом SPringBoot + Hibernate + REST, используя Mysql DB. Я хочу знать, как я могу провести модульное тестирование в следующем классе Мне сказали, что Mocking - лучший способ сделать это. Я думаю, что это связано с проверкой базы данных. Я понятия не имею, даже после много исследований в Интернете. Может кто-нибудь подсказать мне, как мне это проверить. Если в моем проекте есть классы DAO, использующие эти соединения БД, нужно ли мне проверять приведенный ниже класс? У меня даже есть класс RestController, который нужно проверить. Пожалуйста, покажите мне, как мне это делать. Я новичок.

DBConfiguration.Java

package com.youtube.project.config;

import java.util.Properties;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;

@PropertySource(value = { "classpath:application.properties" })
@Configuration
@EnableTransactionManagement
public class DBConfiguration {

    @Value("${jdbc.driverClassName}")
    private String driverClass;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
    @Value("${hibernate.dialect}")
    private String dialect;

    @Bean
    public DataSource getDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource(url,username,password);
        dataSource.setDriverClassName(driverClass);
        return dataSource;
    }

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
        factory.setDataSource(getDataSource());
        factory.setHibernateProperties(hibernateProperties());
        factory.setPackagesToScan(new String[] {"com.youtube.project"});
        return factory;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", dialect);
        properties.put("hibernate.hbm2ddl.auto", "update");
        properties.put("hibernate.show_sql", "true");
        properties.put("hibernate.format_sql", "true");
        return properties;
    }

    @Bean
    @Autowired
    public HibernateTransactionManager transactionManager(SessionFactory factory) {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(factory);
        return transactionManager;
    }

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
          LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
          em.setDataSource(getDataSource());
          em.setPackagesToScan(new String[] { "com.youtube.project.model" });     
          JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
          em.setJpaVendorAdapter(vendorAdapter);
          return em;
       }
} 

1 Ответ

0 голосов
/ 21 марта 2019

Я хочу знать, как я могу выполнить модульное тестирование приведенного ниже класса

Ну, это довольно сложно, потому что ваш класс конфигурации на самом деле устанавливает соединения с базой данных, поэтому этот класс на самом деле не оченьжелательно для «модульного тестирования» как такового.

Поскольку UNIT TESTING - это уровень тестирования программного обеспечения, при котором тестируются отдельные блоки / компоненты (единица измерения является наименьшей тестируемой частью вашего приложения).Обычно он имеет один или несколько входов и обычно один выход.

ИМХО Я бы назвал это интеграционным тестированием, потому что вам нужно будет подключиться к базе данных.

Как подойтитестирование это:

TL; DR - Не беспокойтесь о написании явного теста для этого класса.

Запустив @SpringBootTest в своем основном классе, ваш класс должен пройти проверку в качестве побочного эффекта.

Объяснение:

Это мало что даетимеет смысл тестировать этот класс явно, потому что вы будете в основном тестировать:

  • Были ли созданы бины
  • Заполнены ли поля @Value значениями
  • Является ли соединениек базе данных, установленной

Из этих трех вещей, только пункт № 3 действителен для тестирования, первые два проверены разработчиками Spring, когда они писали среду.При этом подключение к базе данных - это скорее интеграционный тест, чем модульный тест.Если вы хотите проверить это, вы можете использовать базу данных в памяти, такую ​​как H2 , ее можно настроить для работы только на тестах.

У меня есть классы DAO в моем проектекоторые используют эти соединения БД, мне все еще нужно проверить класс ниже?У меня даже есть класс RestController, который нужно протестировать.

Spring имеет отличную поддержку для тестирования приложения ломтики (части вашего приложения, например: один класс за раз иликласс + это зависимости).

В частности:

  • для класса DAO, проверьте @DataJpaTest и TestEntityManager class.
  • Для классов контроллера используйте @WebMvcTest и MockMvc класс.

Эти устройства разработаны для упрощения тестирования с пружинной загрузкой.Для некоторой базовой информации, вы можете проверить эту статью.

Надеюсь, это поможет

...