如何使用Mockito测试SpringBoot中Java注释的Hibernate配置类?

时间:2019-03-19 07:52:34

标签: spring unit-testing spring-boot mocking mockito

我正在使用Mysql DB进行SPringBoot + Hibernate + REST项目。我想知道如何对以下课程进行单元测试。有人告诉我,模拟是最好的解决方法。我认为这与数据库模拟测试有关。即使在网上进行了大量研究后,我也一无所知。有人可以指导我如何测试它。如果我的项目中有使用这些db连接的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 :(得分:0)

  

我想知道如何对以下课程进行单元测试

好吧,这有点复杂,因为您的配置类实际上建立了与数据库的连接,因此对于“单元测试”本身来说,该类实际上并不是很理想。

因为UNIT TESTING是软件测试的一个级别,在此级别中测试了单个单元/组件(单元是应用程序中可测试的最小部分)。它通常只有一个或几个输入,通常只有一个输出。

恕我直言,我将其作为集成测试,因为您需要连接到数据库。

如何进行此测试:

TL; DR -不必为此类编写显式测试。

通过在主类上运行@SpringBootTest,您的类应作为副作用进行测试。

说明:

显式测试该类几乎没有意义,因为您将进行基本测试:

  • 是否已创建bean
  • @Value字段中是否填充了值
  • 是否已建立与数据库的连接

从这三件事来看,只有第3点可以测试,Spring开发人员在编写框架时对前两个条件进行了测试。话虽这么说,连接到数据库更多的是集成测试而不是单元测试。如果要进行测试,可以使用内存数据库,例如 H2 ,可以将其配置为仅在测试中运行。

  

我的项目中有使用这些数据库连接的DAO类,我是否   还需要测试以下课程吗?我什至有RestController类   哪些需要测试。

Spring为测试应用程序 slices (应用程序的一部分,例如:一次一个类或一个类及其依赖项)提供了强大的支持。

特别是:

  • 对于DAO类,请检出@DataJpaTestTestEntityManager类。
  • 对于控制器类,请使用@WebMvcTestMockMvc类。

这些东西旨在简化使用Spring Boot的测试。有关一些基本信息,您可以查看this文章。

希望这会有所帮助