java mock 模拟数据库_spring-mock + dbutil 用来测试数据库操作

大概流程:

1.用dbunit创建初始的测试数据。

2.用spring-mock 维护测试过程中的数据会滚,这样可以保证测试后数据库保持原状态。

3.用junit架构测试。

4.用dbunit销毁初始测试数据。

Java代码 d7d454600f77758df47d870acbf00b9c.png 7a1e7afc0f2addbbdb746966b60e9e4a.png

ffb34937a6f01b9d5cc633a2ffcdf885.png

packagecom.test.dbunit.dao;

importjavax.sql.DataSource;

importorg.dbunit.Assertion;

importorg.dbunit.database.DatabaseConnection;

importorg.dbunit.database.IDatabaseConnection;

importorg.dbunit.database.QueryDataSet;

importorg.dbunit.dataset.IDataSet;

importorg.dbunit.dataset.xml.FlatXmlDataSet;

importorg.dbunit.operation.DatabaseOperation;

importorg.junit.Assert;

importorg.junit.Before;

importorg.junit.Test;

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.core.io.ClassPathResource;

importorg.springframework.jdbc.datasource.DataSourceUtils;

importorg.springframework.test.context.ContextConfiguration;

importorg.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;

importorg.springframework.test.context.transaction.TransactionConfiguration;

importcom.test.dbunit.entity.User;

@ContextConfiguration(locations = {"classpath:testApplicationContext.xml"})

@TransactionConfiguration(defaultRollback =true)

publicclassUserDaoTestextendsAbstractTransactionalJUnit4SpringContextTests {

@Autowired

privateUserDao userDao;

@Autowired

privateDataSource dataSource;

privateIDatabaseConnection conn;

@Before

publicvoidinitDbunit()throwsException {

conn =newDatabaseConnection(DataSourceUtils.getConnection(dataSource));

}

@Test

publicvoidsaveUser()throwsException {

User user =newUser();

user.setNick("user001");

user.setPassword("password001");

userDao.save(user);

QueryDataSet actual =newQueryDataSet(conn);

actual.addTable("user",

"select * from user where user.nick = 'user001'");

IDataSet expected =newFlatXmlDataSet(newClassPathResource(

"com/taobao/dbunit/dao/user001.xml").getFile());

Assertion.assertEquals(expected, actual);

}

@Test

publicvoidupdateUser()throwsException {

IDataSet origen =newFlatXmlDataSet(newClassPathResource(

"com/taobao/dbunit/dao/user001.xml").getFile());

DatabaseOperation.INSERT.execute(conn, origen);

User user =newUser();

user.setNick("user001");

user.setPassword("password002");

userDao.update(user);

QueryDataSet actual =newQueryDataSet(conn);

actual.addTable("user",

"select * from user where user.nick = 'user001'");

IDataSet expected =newFlatXmlDataSet(newClassPathResource(

"com/taobao/dbunit/dao/user001_updated.xml").getFile());

Assertion.assertEquals(expected, actual);

}

@Test

publicvoidremoveUser()throwsException {

IDataSet origen =newFlatXmlDataSet(newClassPathResource(

"com/taobao/dbunit/dao/user001.xml").getFile());

DatabaseOperation.INSERT.execute(conn, origen);

userDao.remove("user001");

QueryDataSet actual =newQueryDataSet(conn);

actual.addTable("user","select * from user where nick = 'user001'");

Assert.assertEquals(0, actual.getTable("user").getRowCount());

}

@Test

publicvoidfindUser()throwsException {

IDataSet data =newFlatXmlDataSet(newClassPathResource(

"com/taobao/dbunit/dao/user001.xml").getFile());

DatabaseOperation.INSERT.execute(conn, data);

User user = userDao.getUserByNick("user001");

Assert.assertEquals("password001", user.getPassword());

}

}

package com.test.dbunit.dao;

import javax.sql.DataSource;

import org.dbunit.Assertion;

import org.dbunit.database.DatabaseConnection;

import org.dbunit.database.IDatabaseConnection;

import org.dbunit.database.QueryDataSet;

import org.dbunit.dataset.IDataSet;

import org.dbunit.dataset.xml.FlatXmlDataSet;

import org.dbunit.operation.DatabaseOperation;

import org.junit.Assert;

import org.junit.Before;

im

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 测试环境的搭建(DBunit+HSQLDB) 1 1.1. DBunit的简介 1 1.1.1. DBunit简单介绍和原理 1 1.1.2. DBunit的三大核心组件 1 1.1.3. DBunit的安装使用 2 1.2. HSQLDB简介 3 1.2.2. 什么是HSQLDB 3 1.2.3. HSQLDB安装和使用 5 1.2.4. HSQLDB使用 7 1.2.5. HSLDB的使用注意事项 8 2. 数据库单元测试测试流程介绍 1 2.1. 数据库单元测试的原因 1 2.2. 测试关注点 1 2.3. 测试流程 1 3. 数据库单元测试最佳实践 2 3.1. 数据库单元测试最佳实践 2 3.1.1. 从“易测试的”应用程序体系结构开始。 2 3.1.2. 使用精确的断言。 2 3.1.3. 外化断言数据。 3 3.1.4. 编写全面的测试。 4 3.1.5. 创建稳定、有意义的测试数据集。 5 3.1.6. 创建专用的测试库。 6 3.1.7. 有效地隔离测试。 7 3.1.8. 分割测试套件。 8 3.1.9. 使用适当的框架(如 DbUnit)简化过程。 9 3.2. DBunit使用最佳实践 9 3.2.1. 每一个开发人员需要搞一个数据库实例。 9 3.2.2. 使用XML文件作为DataSet 9 3.2.3. DBUnit的最佳实践是尽可能使用最小的数据集。 10 3.2.4. DatabaseOperation.CLEAN_INSERT 策略 10 3.2.5. 为相互关联的测试场景创建多个种子文件是一个很有效的策略. 10 3.3. 自我总结 10 3.3.1. 对各种类型的方法的测试策略: 10 3.3.2. 写一个基TestCase。 10 3.3.3. 测试数据库的有效方法。 10 3.3.4. seed文件的设置 10 3.3.5. 一般的测试的步骤 11 4. 常见问题 1 4.1. DBUnit使用问题 1 4.1.1. 在运行测试用例的时候,出现org.dbunit.dataset.DataSetException: java.net.MalformedURLException at……………类似的异常? 1 4.1.2. 在运行测试用例的时候,出现SQLException,并且对应的sqlstate:23504,这是为什么? 1 4.2. HSQLDB相关的问题 1 4.2.1. 抛出:java.sql.SQLException: socket creation error 1 4.3. 其他问题 1
为了实现动态路由和用户权限路由,我们需要进行以下步骤: 1. 安装依赖 ```shell npm install vue-router@4 pinia element-plus mock -S npm install @types/mock -D ``` 2. 创建路由配置文件 在src文件夹下创建router文件夹,并在其中创建index.ts文件,用于配置路由。在该文件中,我们需要定义路由的各个页面组件,并根据需要配置路由的子路由和路由守卫。例如: ```typescript import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router' import Home from '@/views/home/indexName.vue' import Login from '@/views/login/index.vue' import NotFound from '@/views/404/index.vue' const routes: Array<RouteRecordRaw> = [ { path: '/', name: 'Home', component: Home, meta: { title: '首页', requireAuth: true // 需要登录才能访问 } }, { path: '/login', name: 'Login', component: Login, meta: { title: '登录' } }, { path: '/:pathMatch(.*)*', name: 'NotFound', component: NotFound, meta: { title: '404' } } ] const router = createRouter({ history: createWebHistory(), routes }) // 路由守卫 router.beforeEach((to, from, next) => { const token = localStorage.getItem('token') if (to.meta.requireAuth && !token) { next('/login') } else { next() } }) export default router ``` 3. 在main.ts中挂载路由 在main.ts中,我们需要将路由配置文件挂载到Vue实例中,以便在应用中使用路由。例如: ```typescript import { createApp } from 'vue' import App from './App.vue' import router from './router' createApp(App).use(router).mount('#app') ``` 4. 创建权限控制文件 在src文件夹下创建permission文件夹,并在其中创建index.ts文件,用于控制用户权限。在该文件中,我们需要定义用户的权限列表,并根据需要判断用户是否有权限访问某个路由。例如: ```typescript import router from '@/router' const whiteList = ['/login'] // 不需要登录即可访问的页面 router.beforeEach((to, from, next) => { const token = localStorage.getItem('token') if (token) { if (to.path === '/login') { next('/') } else { // 判断用户是否有权限访问该路由 const hasPermission = true // 根据实际情况判断用户是否有权限 if (hasPermission) { next() } else { next('/404') } } } else { if (whiteList.indexOf(to.path) !== -1) { next() } else { next('/login') } } }) ``` 5. 在App.vue中挂载路由渲染入口 在App.vue中,我们需要将路由渲染入口挂载到模板中,以便在应用中渲染路由。例如: ```html <template> <div id="app"> <router-view /> </div> </template> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值