H2内存数据库实现Dao层单元测试

  • 为什么要使用H2数据库:

    • 在写DAO层的单元测试时,我们往往会遇到一个问题,测试用例所依赖的数据库数据被修改或删除了,或者在一个新的环境下所依赖的数据库不存在,导致单元测试无法通过,进而构建失败。
    • 在这种情况下,使用H2内存数据库来模拟数据库环境是一个很好的解决方案:这种数据库可以伴随着我们的单侧用例启动而启动,运行结束即关闭,对数据不会进行持久化的操作;

操作步骤:

1.引入pom.xml文件依赖

  • </dependency>
  • <dependency>
    • <groupId>com.h2database</groupId>
    • <artifactId>h2</artifactId>
    • <scope>test</scope>
  • 2.配置JDBC.properties:

    • jdbc.gaotu.url=jdbc:h2:mem:gaotu;MODE=MYSQL;DB_CLOSE_DELAY=-1
      • jdbc:h2:mem:  表示使用的数据库是H2内存数据库;
      • gaotu:表示数据库的命名;
      • MODE=MYSQL 表示我们的数据库以mySql的形式运行
      • DB_CLOSE_DELAY=-1 设置数据库延时关闭,给代码执行预留时间
  • 3.写sql;(这里的sql用的是H2数据库的sql语句)

    • schema.sql
    • data.sql
  • 4.数据源配置:

    • 1)文件如下:
      • package com.gaotu.test.config;
        import org.apache.ibatis.session.SqlSessionFactory;
        import org.mybatis.spring.SqlSessionFactoryBean;
        import org.mybatis.spring.annotation.MapperScan;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.beans.factory.annotation.Qualifier;
        import org.springframework.beans.factory.annotation.Value;
        import org.springframework.context.annotation.Bean;
        import org.springframework.context.annotation.Configuration;
        import org.springframework.context.annotation.PropertySource;
        import org.springframework.core.io.ClassPathResource;
        import org.springframework.core.io.Resource;
        import org.springframework.jdbc.datasource.DataSourceTransactionManager;
        import org.springframework.jdbc.datasource.DriverManagerDataSource;
        
        import org.springframework.jdbc.datasource.init.DatabasePopulator;
        import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils;
        import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
        import org.springframework.transaction.PlatformTransactionManager;
        import org.springframework.transaction.annotation.EnableTransactionManagement;
        
        import javax.sql.DataSource;
        
        @Configuration
        @EnableTransactionManagement
        @PropertySource(ignoreResourceNotFound = true, value = { "classpath:jdbc.properties" })
        @MapperScan(basePackages = { "com.gaotu.mapper",
                "com.jiazi.**.mapper","com.gaotu.**.mapper.auto" }, sqlSessionFactoryRef = "gaotuSessionFactory")
        public class GaotuDataSourceTestConfig {
        
            @Value("${jdbc.gaotu.username}")
            private String username;
        
            @Value("${jdbc.gaotu.password}")
            private String password;
        
            @Value("${jdbc.gaotu.url}")
            private String url;
        
            @Value("classpath:/db/gaotu/INIT_TABLE.sql")
            private Resource schemaScript;
        
            @Value("classpath:/db/gaotu/INIT_DATA.sql")
            private Resource dataScript;
        
        
            public DataSource gaotuDatasource() throws Exception {
                DriverManagerDataSource dataSource = new DriverManagerDataSource(url, username, password);
        
                return dataSource;
            }
        
            @Bean(name = "gaotuDatasource")
            public DataSource getDataSource() throws Exception {
                DataSource dataSource = gaotuDatasource();
                DatabasePopulatorUtils.execute(databasePopulator(), dataSource);
                return dataSource;
            }
        
            @Bean(name = "gaotuSessionFactory")
            public SqlSessionFactory sqlSessionFactoryBean(
                @Autowired @Qualifier(value = "gaotuDatasource") final DataSource dataSource) throws Exception {
                SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
                sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("db/mybatis-config.xml"));
                sqlSessionFactoryBean.setDataSource(dataSource);
                return sqlSessionFactoryBean.getObject();
            }
        
            private DatabasePopulator databasePopulator() {
                final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
                populator.addScript(schemaScript);
                populator.addScript(dataScript);
                return populator;
            }
        
            @Bean(name = "gaotuTransactionManager")
            public PlatformTransactionManager gaotuTransactionManager(
                @Autowired @Qualifier(value = "gaotuDatasource") final DataSource dataSource) {
                return new DataSourceTransactionManager(dataSource);
            }
        }
      • 2)文件如下:
        • package com.gaotu.test.config;
          
          import org.springframework.context.annotation.ComponentScan;
          import org.springframework.context.annotation.Configuration;
          import org.springframework.context.annotation.PropertySource;
          
          @Configuration
          @PropertySource(value = {"classpath:application.properties"})
          @ComponentScan(basePackages = { "com.gaotu.**.dao"})
          public class DaoBasicTestConfig {
          }
          
  • 5.写单侧实例:
    • 1)BaseDaoTest.java
      • package com.gaotu.test.base;
        
        import com.gaotu.test.config.DaoBasicTestConfig;
        import com.gaotu.test.config.GaotuDataSourceTestConfig;
        
        import org.junit.runner.RunWith;
        import org.springframework.test.context.ContextConfiguration;
        import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
        
        @RunWith(SpringJUnit4ClassRunner.class)
        @ContextConfiguration(classes = { DaoBasicTestConfig.class, GaotuDataSourceTestConfig.class})
        public class BaseDaoTest {}
      • 2)具体的单侧
        • package com.gaotu.order.dao.test;
          
          import com.gaotu.mapper.auto.OrderInfo;
          import com.gaotu.order.dao.OrderInfoDAO;
          import com.gaotu.test.base.BaseDaoTest;
          
          import org.junit.Assert;
          import org.junit.Test;
          
          import javax.annotation.Resource;
          
          public class OrderInfoDAOTest extends BaseDaoTest {
          
              @Resource
              private OrderInfoDAO orderInfoDAO;
          
              @Test
              public void testGetOrderInfoByOrderId() {
                  final OrderInfo orderInfo = orderInfoDAO.getOrderInfoByOrderId("251996234968758");
                  Assert.assertNotNull(orderInfo);
                  Assert.assertEquals(251996234968758L, orderInfo.getOrderNumber().longValue());
              }
              
          }
出现这个错误的原因是在导入seaborn包时,无法从typing模块中导入名为'Protocol'的对象。 解决这个问题的方法有以下几种: 1. 检查你的Python版本是否符合seaborn包的要求,如果不符合,尝试更新Python版本。 2. 检查你的环境中是否安装了typing_extensions包,如果没有安装,可以使用以下命令安装:pip install typing_extensions。 3. 如果你使用的是Python 3.8版本以下的版本,你可以尝试使用typing_extensions包来代替typing模块来解决该问题。 4. 检查你的代码是否正确导入了seaborn包,并且没有其他导入错误。 5. 如果以上方法都无法解决问题,可以尝试在你的代码中使用其他的可替代包或者更新seaborn包的版本来解决该问题。 总结: 出现ImportError: cannot import name 'Protocol' from 'typing'错误的原因可能是由于Python版本不兼容、缺少typing_extensions包或者导入错误等原因造成的。可以根据具体情况尝试上述方法来解决该问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ImportError: cannot import name ‘Literal‘ from ‘typing‘ (D:\Anaconda\envs\tensorflow\lib\typing....](https://blog.youkuaiyun.com/yuhaix/article/details/124528628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值