悬赏如何junit测试返回值void的输出验证码图片功能的servlet!

问题描述

悬赏如何junit测试返回值void的输出验证码图片功能的servlet!
刚接触到验证码生成算法,由于楼主刚入职职场,刚接触junit测试,知道junit是白盒子测试,也只会用代用返回值的测试。现在我要写一个生成验证码的serlvet,此serlvet可以向客户端返回一个验证码的jpg图片。请问如果用junit来测试这个类的生成验证码功能是否生效?我知道难度可能有点大,所以希望大神耐心解答,50分献上!
 public class ValidateCodeServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    // 设置验证图片的宽度, 高度, 验证码的个数
    private int width = 152;
    private int height = 40;
    private int codeCount = 4;

    // 验证码字体的高度
    private int fontHeight = 4;

    // 验证码中的单个字符基线. 即:验证码中的单个字符位于验证码图形左上角的 (codeX, codeY) 位置处
    private int codeX = 0;
    private int codeY = 0;

    // 验证码由哪些字符组成
    char[] codeSequence = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz23456789"
            .toCharArray();

    // 初始化验证码图形属性
    @Override
    public void init() {
        fontHeight = height - 2;
        codeX = width / (codeCount + 2);
        codeY = height - 4;
    }

    @Override
    public void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 定义一个类型为 BufferedImage.TYPE_INT_BGR 类型的图像缓存
        BufferedImage buffImg = null;
        buffImg = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);

        // 在 buffImg 中创建一个 Graphics2D 图像
        Graphics2D graphics = null;
        graphics = buffImg.createGraphics();

        // 设置一个颜色, 使 Graphics2D 对象的后续图形使用这个颜色
        graphics.setColor(Color.WHITE);

        // 填充一个指定的矩形: x - 要填充矩形的 x 坐标; y - 要填充矩形的 y 坐标; width - 要填充矩形的宽度; height
        // - 要填充矩形的高度
        graphics.fillRect(0, 0, width, height);

        // 创建一个 Font 对象: name - 字体名称; style - Font 的样式常量; size - Font 的点大小
        Font font = null;
        font = new Font("", Font.BOLD, fontHeight);
        // 使 Graphics2D 对象的后续图形使用此字体
        graphics.setFont(font);

        graphics.setColor(Color.BLACK);

        // 绘制指定矩形的边框, 绘制出的矩形将比构件宽一个也高一个像素
        graphics.drawRect(0, 0, width - 1, height - 1);

        // 随机产生 15 条干扰线, 使图像中的认证码不易被其它程序探测到
        Random random = null;
        random = new Random();
        graphics.setColor(Color.GREEN);
        for (int i = 0; i < 10; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int x1 = random.nextInt(20);
            int y1 = random.nextInt(20);
            graphics.drawLine(x, y, x + x1, y + y1);
        }

        // 创建 randomCode 对象, 用于保存随机产生的验证码, 以便用户登录后进行验证
        StringBuffer randomCode;
        randomCode = new StringBuffer();

        for (int i = 0; i < codeCount; i++) {
            // 得到随机产生的验证码数字
            String strRand = null;
            strRand = String.valueOf(codeSequence[random.nextInt(36)]);

            // 用随机产生的颜色将验证码绘制到图像中
            graphics.setColor(Color.BLUE);
            graphics.drawString(strRand, (i + 1) * codeX, codeY);

            // System.out.println("^^" + strRand);
            randomCode.append(strRand);
        }

        //向session中写入验证码信息
        request.getSession().setAttribute("checkCode", randomCode.toString());

        // 禁止图像缓存
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);

        // 将图像输出到输出流中
        ServletOutputStream sos = null;
        sos = response.getOutputStream();
        ImageIO.write(buffImg, "jpeg", sos);
        sos.close();
    }
}

解决方案

这是我写的测试类,写的不怎么好,但是基本能够进行测试,在网上几乎没有搜出相应的解决方法,可能是测试servlet功能不流行吧,不过话说,开发中都不用纯servler的。

 import static org.junit.Assert.*;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.easymock.EasyMock;
import org.junit.Test;
import org.springframework.mock.web.MockHttpSession;

public class ValidateCodeServletTest {
    private static Logger logger = Logger.getLogger(ValidateCodeServletTest.class);

    @Test
    public void testServiceHttpServletRequestHttpServletResponse() {
        HttpServletRequest reqMock = EasyMock.createMock(HttpServletRequest.class);
        HttpServletResponse respMock = EasyMock.createMock(HttpServletResponse.class);

        HttpSession session = new MockHttpSession();

        EasyMock.expect(reqMock.getSession()).andReturn(session);
        EasyMock.replay(reqMock);

        ValidateCodeServlet test = new ValidateCodeServlet();
        test.init();
        try {
            test.service(reqMock, respMock);
        } catch (ServletException e) {
            logger.error("调用验证码出异常", e);
        } catch (IOException e) {
            logger.error("输入输出流抛出异常", e);
        }

        EasyMock.verify(reqMock);
    }
}

解决方案二:

http://blog.csdn.net/edward_qing_lee/article/details/7283104

时间: 2024-10-26 05:49:30

悬赏如何junit测试返回值void的输出验证码图片功能的servlet!的相关文章

返回值-为什么最后输出结果会是0?当被调函数中的if语句不成立时不想要它返回该如何?

问题描述 为什么最后输出结果会是0?当被调函数中的if语句不成立时不想要它返回该如何? #include<stdio.h> char a[15]; int count=0; int fun(int store,int flower,int wine,int i) { if(store>5 || flower>10) return 0; else if(store==5 && flower==10 && i==15) { if(wine==0 &

Java线程:新特征-有返回值的线程

在Java5之前,线程是没有返回值的,常常为了"有"返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了. 现在Java终于有可返回值的任务(也可以叫做线程)了. 可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口. 执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了. 下面是个很简单的例子: import java.util.concurrent.*

存储过程的输出参数,返回值与结果集_MsSql

每个存储过程都有默认的返回值,默认值为0.下面我们分别看看在management studio中如何查看输出参数,返回值以及结果集,然后我们再在ASP.NET调用存储过程中如何获得输出参数,返回值以及结果集. 首先:在sql server management studio中查看输出参数,返回值以及结果集.本示例以Northwind数据库为例. 复制代码 代码如下: create proc Employee @Rowcount int=0 output as begin SELECT * FRO

Junit测试框架

最简单的例子介绍Junit测试框架 public class Person { public void run() { System.out.println("run!!!"); } public void eat() { System.out.println("eat!!!"); } public static void main(String[] args){ System.out.println("miao"); } } import or

存储过程的输出参数,返回值与结果集

每个存储过程都有默认的返回值,默认值为0.下面我们分别看看在management studio中如何查看输出参数,返回值以及结果集,然后我们再在ASP.NET调用存储过程中如何获得输出参数,返回值以及结果集. 首先:在sql server management studio中查看输出参数,返回值以及结果集.本示例以Northwind数据库为例. 复制代码 代码如下: create proc Employee @Rowcount int=0 output as begin SELECT * FRO

html中,table标签的input的text的返回值是什么

问题描述 html中,table标签的input的text的返回值是什么 我自己写了个servlet,用这个返回值做条件,发现如果text没有内容,返回的不是null,用system out println 打出来是空白,这个返回值到底是什么 解决方案 http://www.w3school.com.cn/tags/tag_input.asp

线程中的回调函数如何获得返回值,请高手开悟,在线等......

问题描述 普通回调方法:classA{classBxx=newclassB();stringss=k.ca(tm);stringtm(stringxm){returnxm+"一杯醉倒";}}classB{publicdelegatestringtc();publicstringca(tcmm){MessageBox.Show("到这里了!");returnmm("我");}}执行stringss=k.ca(tm);语句后,得到回调函数tm的返回值

03_MyBatis基本查询,mapper文件的定义,测试代码的编写,resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询ma

 1 PersonTestMapper.xml中的内容如下: <?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEmapper PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--  namespace:命名空间,用来唯

progress.report-c# 如何等待一个返回值为void的进度报告事件结束?

问题描述 c# 如何等待一个返回值为void的进度报告事件结束? 需求:progress.Report执行进度报告完成后,再执行其余的代码:问题:progress.Report的返回值是void,没法用await,怎么等待其结束? 解决方案 答案出来了: var task = Task<int>.Run(() => { int i = UpdateResult(dictionaryStockReal[stockCode]); return i; }); //报告一次进度后退出if(tas