文档章节

Play 1.x 功能测试乱码及编码问题 (Encoded Question In Play 1.x FunctionalTest)

奋斗到天明
 奋斗到天明
发布于 2015/08/27 18:09
字数 781
阅读 30
收藏 0
点赞 0
评论 0

大家在估做功能测试的时候,不知有没有发现,如果统一用utf-8作为编码,POST测试请求中如果带有汉字就会乱码。

{"box":[{"entityId":7,"id":7,"idea":"?????","jPAContext":{"insideTransaction":true,"jPAConfig":{"configName":"play","enabled":true,"insideTransaction":true,"jPAContext":{"$ref":".."},"jpql":{}}},"persistent":false,"type":1},{"entityId":8,"id":8,"idea":"???","jPAContext":{"$ref":"$.box[0].jPAContext"},"persistent":false,"type":5},{"idea":"???","jPAContext":{"$ref":"$.box[0].jPAContext"},"persistent":false,"type":3}],"code":"jack","entityId":1003,"id":1003,"ip":"192.168.1.122","jPAContext":{"$ref":"$.box[0].jPAContext"},"nick":"??","passwd":"jack2","persistent":true,"qqmail":"200@qq.com"}


这个是一个典型的编码问题,但是我找遍play也没有找到相关的设置,只好用调试看看。 

1.我在从yml文件读取数据过程,我发现数据还不是乱码 

2.在请求到达第七章提及的ActionInvoker中的时候,已经乱码。 

所以我推测,应该是play框架对POST请求进行封装是出了问题在所有功能测试父类FunctionalTest中,重载了许多POST方法,其中根本是这个POST: play.test.FunctionalTest.java

public static Response POST(Request request, Object url, Map parameters, Map files) {
        List parts = new ArrayList();

        for (String key : parameters.keySet()) {
            parts.add(new StringPart(key, parameters.get(key)));
        }

        for (String key : files.keySet()) {
            Part filePart;
            try {
                filePart = new FilePart(key, files.get(key));
            } catch (FileNotFoundException e) {
                throw new RuntimeException(e);
            }
            parts.add(filePart);
        }

        MultipartRequestEntity requestEntity = new MultipartRequestEntity(parts.toArray(new Part[]{}), null); 
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            requestEntity.writeRequest(baos);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        InputStream body = new ByteArrayInputStream(baos.toByteArray());
        String contentType = requestEntity.getContentType();
        Http.Header header = new Http.Header();
        header.name = "content-type";
        header.values = Arrays.asList(new String[]{contentType});
        request.headers.put("content-type", header);
        return POST(request, url, MULTIPART_FORM_DATA, body);
    }


在这个方法中,有一个new StringPart()的方法

parts.add(new StringPart(key, parameters.get(key)));


我跟进去之后,发现这厮也是重载方法: com.ning.http.multipart.StringPart.java

public StringPart(String name, String value, String charset)
    {
        super(name, "text/plain", charset != null ? charset : "US-ASCII", "8bit");
        if(value == null)
            throw new IllegalArgumentException("Value may not be null");
        if(value.indexOf('\0') != -1)
        {
            throw new IllegalArgumentException("NULs may not be present in string parts");
        } else
        {
            this.value = value;
            return;
        }
    }

    public StringPart(String name, String value)
    {
        this(name, value, null);
    }


代码一目了然,

super(name, "text/plain", charset != null ? charset : "US-ASCII", "8bit");


如果没有charset,他就会默认“US-ASCII”! 问题出来的,解决方法就多了,可以在StringPart处将默认的改为“UTF-8”,也可以在POST方法中多传一个“UTF-8”参数。 但是,这两个方法都不太优雅,我这里提供一种方法。首先构造一个测试类的父类: function.BasisTest.java

public class BasisTest extends FunctionalTest{
    public static Response POST(Object url, Map parameters) {
        return POST(newLocalRequest(), url, parameters, new HashMap());
    }
   
    public static Request newLocalRequest() {
        Request request = Request.createRequest(
            null,
            "GET",
            "/",
            "",
            null,
            null,
            null,
            null,
            false,
            80,
            "localhost",
            false,
            null,
            null
        );
        request.encoding = "utf-8";
        return request;
    }
}


覆盖FunctionalTest的POST类,并构建自己的Request,这个地方还可以设定cookie,方便在有登陆拦截的情况下,进行功能测试。这里主要是设定请求的encoding。 然后在FunctionalTest中POST方法中将StringPart构造方法该为三个参数,加上request.encoding。

parts.add(new StringPart(key, parameters.get(key), request.encoding));


这样编码就是活的,可以自行设定。

{"box":[{"entityId":7,"id":7,"idea":"老马太瘦了","jPAContext":{"insideTransaction":true,"jPAConfig":{"configName":"play","enabled":true,"insideTransaction":true,"jPAContext":{"$ref":".."},"jpql":{}}},"persistent":false,"type":1},{"entityId":8,"id":8,"idea":"矮矬富","jPAContext":{"$ref":"$.box[0].jPAContext"},"persistent":false,"type":5},{"idea":"汝甚吊","jPAContext":{"$ref":"$.box[0].jPAContext"},"persistent":false,"type":3}],"code":"jack","entityId":1003,"id":1003,"ip":"192.168.1.122","jPAContext":{"$ref":"$.box[0].jPAContext"},"nick":"老马","passwd":"jack2","persistent":true,"qqmail":"200@qq.com"}

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
Play 1.x框架学习之一:功能测试 (functional test in play framework)

Play框架中已经集成了junit框架,大家可以非常方便的进行功能测试,这里我展现一个测试新增的例子,其他的大家可以照这个例子深入。 首先需要在app/modules包中定义一个Beat类,app/control...

刀狂剑痴 ⋅ 2015/08/27 ⋅ 0

Play Framework 2.0 介绍

Play Framework 刚刚发布了 2.0 正式版,来看看 Play Framework 2.0 的新特性介绍吧。 原生支持 Java 和 Scala Play Framework 1.x 完全是采用 Java 编写的,可通过插件来支持 Scala,而 2....

红薯 ⋅ 2012/03/14 ⋅ 20

play框架之环境搭建

项目主页: http://www.playframework.org/ 项目简介: Play!是一个full-stack(全栈的)Java Web应用框架,包括一个简单的无状态MVC模型,具有Hibernate的对象持续,一个基于Groovy的模板引...

jeffsui ⋅ 2012/03/07 ⋅ 2

Intellij Idea 配置 Play 1.x Framework 开发环境 (configuration Play 1 x Framework development environmen...

虽然在公司使用的是Eclipse,但是我还是很中意俊俏的Intellij Idea(当然还有风骚的Sublime Text),Play 是一个类ROR的框架(Play 1.x 是比较正统的Java框架,Play 2.x混入Scala血统,个人不...

刀狂剑痴 ⋅ 2015/08/27 ⋅ 0

java 获取实参的名字

我想做一个视图渲染的类,里面有一个render方法,希望实现这个功能,如: String bc = "accc";render(bc); 然后在视图中可以这么实用: $bc //这里会被渲染成内容是accc的段落 这样的话需要获...

唐海康 ⋅ 2013/04/18 ⋅ 3

Play 1.x 日期格式与参数绑定 (Play 1.x Date Format And Parameter Binding)

昨天项目中遇到一个棘手的问题。是关于日期格式的。 项目是前端Delphi,后端Play 1.x。在进行数据交互的时候。日期有两种格式,长格式:yyyy-MM-dd HH:mm:ss,短格式:yyyy-MM-dd。 在Play ...

刀狂剑痴 ⋅ 2015/08/27 ⋅ 0

greenlaw110/Rythm

Rythm A "Razor" like, rich featured, high performance and easy to use Java template engine Links: The documentation The fiddle site Integrations play-rythm for Play!Framework 1.......

greenlaw110 ⋅ 2015/05/06 ⋅ 0

关于Play(Play 2.0 介绍)

Play 2.0 介绍 2007开始,我们一直致力于让Java开发web应用更容易。Play始于一个内部项目Zenexity,它深刻影响了我们开发web项目的方式:关注开发者生产力,遵循web架构的特点,并打破常规,...

大东哥 ⋅ 2012/03/19 ⋅ 0

分享一个用Scala Play + Slick 开始写的一个学习的开源web app

好, 最近在學Play,用Play在這些天寫了一個初始的app,用的是Play! framework 2.x + Play slick 1.x,前端用的是,原始的bootstrap。已经开源,https://github.com/hellomaya/scala-connec...

自由之信 ⋅ 2016/01/24 ⋅ 2

spring 如何配置自定义模板引擎

最近在学习spring mvc,以前是用Play开发的,比较喜欢Play 1.x的模板引擎,另外对于jsp/el也不熟悉,不是很想去学,想知道spring要使用其他模板引擎的话要怎么配置呢,另外提问一下有没有人对...

唐海康 ⋅ 2013/03/29 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JAVA RMI

什么是JAVA RMI Java RMI (Remote Method Invocation) 远程方法调用,能够让客户端像使用本地调用一样调用服务端 Java 虚拟机中的对象方法。RMI 是面向对象语言领域对 RPC (Remote Proced...

saulc ⋅ 8分钟前 ⋅ 0

Linux系统工程狮养成记

如今的社会,随着时代的发展,出现了很多职业,像电子类,计算机类的专业,出现了各种各样的工程师,有算法工程师,java工程师,前端工程师,后台工程师,Linux工程师,运维工程师等等,不同...

linux-tao ⋅ 18分钟前 ⋅ 0

进入编辑模式 vim命令模式 vim实践

1.

oschina130111 ⋅ 18分钟前 ⋅ 0

mysql用户管理、常用sql语句、mysql数据库备份恢复

1. mysql用户管理 mysql默认有一个root超级管理员账户,实际工作环境中不可能每个人都用此root权限,防止误操作、误删除,可以给单独的用户进行授权。 Mysql创建用户以及授权: grant all on...

laoba ⋅ 18分钟前 ⋅ 0

类型后面三个点(String...)和数组(String[])的区别

类型后面三个点(String…),是从Java 5开始,Java语言对方法参数支持一种新写法,叫可变长度参数列表,其语法就是类型后跟…,表示此处接受的参数为0到多个Object类型的对象,或者是一个Obj...

流氓兔- ⋅ 24分钟前 ⋅ 0

JEPLUS表格组件之表格合并——JEPLUS软件快速开发平台

JEPLUS表格组件之表格合并 我们在列表配置时会遇见这样的一种情况,需要对个人的数据进行统一化,对一些数据进行归类,这样展示出来美观又直观,在这篇笔记中我来给大家介绍下如何配置出来专...

JEPLUS ⋅ 25分钟前 ⋅ 0

golang 并发中全局唯一操作

package main// go 携程共享 数据// 加锁解锁操作// 同步锁import ("sync""fmt")// 创建Once结构var once = sync.Once{}func computed(data *int, lock *sync.Mut...

304158 ⋅ 26分钟前 ⋅ 0

Mobx入门之二:asynchronous actions

这一节主要看mobx怎么实现asynchronous actions 1 要实现的demo功能 输入地名,查询天气,利用openweathermap api 2 思想 observable观察数据:location地点、temperature温度 observer响应式...

pengqinmm ⋅ 28分钟前 ⋅ 0

【2018.0620学习笔记】【linux高级知识 13.4-13.6】

13.4 mysql用户管理 13.5 常用sql语句 13.6 mysql数据库备份恢复

lgsxp ⋅ 50分钟前 ⋅ 0

Java强弱引用示例

package jdk;import java.lang.ref.PhantomReference;import java.lang.ref.ReferenceQueue;import java.lang.ref.SoftReference;import java.lang.ref.WeakReference;public ......

月下狼 ⋅ 55分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部