单元测试
断言的使用
assertEquals(String message, int expected, int actual)
message:可选,如果提供的话,将会在发生错误的时候报告这个消息
expected:是你的期望值,一般是硬编码的
actual:是被测试代码实际产生的值
assertNotNull(String message, Object object)
assertNull(String message, Object object)
验证一个对象是否为null(notNull),如果为null(notNull),则测试失败,message为可选
assertSame(String message, Object expected, Object actual)
验证一个expected参数和actual参数所应用的对象是否是同一个对象,如果不是,测试失败,message可选
assertNotSame(String message, Object expected, Object actual)
验证一个expected参数和actual参数所应用的对象是否不是同一个对象,如果是,测试失败,message可选
assertTrue(String message,boolean condition)
验证表达式的值是不是为Ture,如果不为真,测试失败
assertFalse(String message, boolean condition)
样子表达式的值是不是false,如果不为false,测试失败,message可选
Setup和TearDown
Setup方法在测试方法执行前执行,一般用来申请系统资源,或者初始化类和数据使用
TearDown方法在测试方法执行之后自信,一般用来释放系统资源
测试异常
假设我们测试sortList()方法,我们希望在测试为null的情况下,方法能够抛出正常的异常
public void testForException(){
try{
sortList(null);
fail("should have thrown an exception");
}catch(Exception e){
assertTure(ture);
}
}
测试应该遵循的原则--Right-BICEP
Right: 结果是否**正确**
B: 是否所有的**边界**条件都是正确的
I: 能查一下**反向**关联吗
C: 能用其他手段**交叉检查**一下结果吗
E: 你是否可以强制**错误条件**发生
P: 能否满足**性能**要求
Mock对象
在单元测试中,我们常遇到的问题是应用中其它的协同模块尚未开发完成,或者被测试模块需要和一些不容易构造、比较复杂的对象进行交
互另外,由于不能肯定其它模块的正确性,我们也无法确定测试中发现的问题是由哪个模块引起的。Mock 对象能够模拟其它协同模块的行
为,被测试模块通过与 Mock 对象协作,可以获得一个孤立的测试环境。此外,使用 Mock 对象还可以模拟在应用中不容易构造(如
HttpServletRequest 必须在 Servlet 容器中才能构造出来)和比较复杂的对象(如 JDBC 中的 ResultSet 对象),从而使测试
顺利进行。
使用servlet来举例
public class ResultServletTest {
private AwardResultServlet servlet;
private HttpServletRequest mockRequest;
private HttpServletResponse mockResponse;
@Before
public void setUp(){
servlet = new ResultServlet();
mockRequest = createMock(HttpServletRequest.class); //加载
mockResponse = createMock(HttpServletResponse.class);
}
@After
public void tearDown(){
verify(mockRequest); //验证
verify(mockResponse);
}
@Test
public void testDoPostHttpServletRequestHttpServletResponse() throws ServletException, IOException {
mockRequest.getParameter("id"); //传入参数
expectLastCall().andReturn("1");
mockRequest.getParameter("name"); //传入参数
expectLastCall().andReturn("chevy");
mockRequest.getParameter("gender"); //传入参数
expectLastCall().andReturn("男");
replay(mockRequest); //回放
replay(mockResponse);
servlet.doPost(mockRequest, mockResponse); //调用
}
}