Fork me on GitHub

利用Spring和JUnit对数据库操作进行单元测试

在进行Java程序开发时,我们偶尔会被要求使用JUnit进行单元测试来确保我们所写的程序逻辑是正确的。一个良好的单元测试应该具备 覆盖度高可重复执行,单一性等特点。本文主要关注可重复执行,在Web开发中,大部分方法都会使数据库的记录发生变化,为了能够重复执行,必须利用数据库事务来进行回滚从而达到重复执行的目的。最原始的方法是利用 java.sql.Connection类的 commit()rollback() 方法来在每个单元测试方法中手动的进行提交或回滚,此种方式使得单元测试代码嵌入了与实际业务逻辑无关的数据库操作事务控制代码。利用SpringJUnit通过注解的方式我们可以很容易的对单元测试中的数据库操作进行事务控制。

利用Spring Security动态改变登录用户的权限

利用Spring Security来管理我们的web程序时,通常需要在UserDetailsService接口中的loadUserByUsername方法中来初始化权限信息,但UserDetailsService一般用于登录验证,这也意味着用户的权限在登录过程中就会被计算出来。通常情况下由于用户的权限很少发生变化,在登录过程中计算出用户权限是合理的,但有些情况下,我们需要在中途来动态的改变用户的权限,此时我们可以利用Spring Security提供的API来实现。

在Spring中利用Mock对HttpServletRequest进行单元测试

编写单元测试时的注意事项

根据软件开发过程中的TDD理论,在我们编写自己的代码时,要尽量使得该代码能够进行单元测试。为了能够使得代码可以进行单元测试,我们在给接口或方法传入参数时要尽量传入简单参数,避免传入HttpServletRequest , ServletContext等和web上下文相关的复杂对象。但仍有部分情况下基于代码简洁性和可维护性的考虑,我们需要传入HttpServletRequest对象,此时对此类方法进行JUnit单元测试时会较为困难,本文介绍一种在Spring中通过Mock来模拟HttpServletRequest对象进行JUnit单元测试的方法。

Mediawiki添加回到顶部的方法

Mediawiki维基百科系统所采用的框架,适合于需要快速搭建知识分享的场合。采用Mediawiki生成的知识共享平台和维基百科的操作与使用类似,都支持采用Markdown语法来编辑。在有些时候,某些词条的内容很长,使得浏览器出现了滚动条,如果能仿照微博等网站添加一个回到顶部的功能,将会给我们的使用带来很大的便利,本文介绍一种实现方法:

[译] Java Volatile 关键字详解

本文翻译自 Java Volatile Keyword

Java关键字volatile用于将一个Java变量标记为在主内中存储,更准确的解释为:每次读取一个volatile变量时将从电脑的主内存中读取而不是从CPU缓存中读取,每次对一个volatile变量进行写操作时,将会写入到主内存中而不是写入到CPU缓存中。

事实上,从Java5之后,volatile关键字不仅仅可以用来确保volatile变量是写入到主内存和从主内存读取数据,我会在下面的章节进行详细的介绍:

Cannot run program "mysqldump": CreateProcess error=2, The system cannot find the file specified

项目中用到了MySQL数据库的备份功能,通过调用Java程序中的Runtime来执行mysqldump命令自动的生成相关的MySQL数据库文件以供恢复之用。相关的代码如下:

1
2
3
4
Runtime runtime = Runtime.getRuntime();
String mysqlCmd = "mysqldump" + " -u" + username + " -p" + password + 
           "  -h " + databaseAddress + " " +databaseName;
Process process = runtime.exec(mysqlCmd);

但是在客户那里实际使用时,有时候会出现在cmd中MySQL命令可以正常识别但是程序不能正常执行的情况,报错信息如下: