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



我正在使用mysql db进行Springboot Hibernate REST项目。我想知道如何单元测试以下课程。有人告诉我,嘲笑是最好的方法。我认为这与数据库模拟测试有关。即使在网上进行了很多研究之后,我也没有任何线索。有人可以指导我如何测试。如果我的项目中有DAO课程使用THSE DB连接,我是否仍需要测试以下课程?我什至有需要测试的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;
       }
} 

我想知道如何单元测试以下类

好吧,这有点复杂,因为您的配置类实际上与数据库建立了连接,因此对于"单元测试" per-se实际上并不是很理想的。

因为单元测试是对单个单元/组件进行测试的软件测试级别(单位是应用程序中最小的可测试部分)。它通常具有一个或几个输入,通常有一个输出。

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

如何进行测试:

tl; dr - 不要打扰为此课程编写明确的测试。

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

说明:

明确测试该类毫无意义,因为您基本上会测试:

  • 是否创建了bean
  • 是带有值的@Value字段
  • 是建立数据库的连接

从这三件事中,只有第3点有效测试,前两个在编写框架时由春季开发人员测试。话虽如此,连接到数据库更像是集成测试,而不是单位测试。如果要测试,可以使用> H2 的内存数据库,可以将其配置为仅在测试上运行。

我的项目中有DAO课程,使用了DB连接,我是否 仍然需要测试以下课程吗?我什至有RestController课程 需要测试。

Spring对测试应用程序有很好的支持 slices (您的应用程序的一部分,例如:一次类别或一个类 它的依赖项)。

特别:

  • 对于DAO课程,请查看@DataJpaTestTestEntityManager类。
  • 对于控制器类,使用@WebMvcTestMockMvc类。

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

希望这有帮助

相关内容

  • 没有找到相关文章

最新更新