关于单元测试

单元测试

How:

1. 单元测试是测试对象的行为,而不是测试单一方法本身
2. 单元测试是针对单一对象的行为进行测试,所以应该尽可能缩小对外部的依赖范围。例如A.a()方法依赖B,B又依赖C,这时候应该进行使用B的模拟对象进行A.a()的单元测试,而不要使用真实的B(POJO除外)

Why: 单元测试可以保障代码重构安全,使得重构能放心地进行,从而令开发人员有信心改善代码质量


如何模拟JNDI

背景

数据源的JNDI配置在应用服务器上,在单元测试时脱离了容器环境,如何令单元测试顺利执行?

方法

Spring中提供了类org.springframework.mock.jndi.SimpleNamingContextBuilder,可以将任意对象注册为JNDI对象,所以可以编写一个父类,先把JNDI对象注册好,子类初始化的时候就可以拿到该JNDI对象了,父类代码如下:

1
2
3
4
5
6
7
8
9
10
public class AbstractTest {
@BeforeClass
public static void setUpBeforeClass() throws NamingException {
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:testDs.spring.xml");
SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
builder.bind("jdbc/MySQLDS", ctx.getBean("testDs"));
builder.activate();
}