文档章节

goja框架model和controller测试

 大海无量1
发布于 2016/09/30 15:24
字数 559
阅读 21
收藏 0

最近在研究model/controller单元测试的问题。

一model测试还好,只要编写测试类 继承ModelTestCase,在此类中的测试方法前加上@Test就可以运行。

二controller测试比较麻烦 当前goja-test中的ControllerTestCase 有泛型检查 ,但是编写测试类继承它的时候有没有泛型参数要加,所以我自己拷贝一份ControllerTestCase 把泛型检查去除了,再运行此类中的测试方法 会在jfinal关闭的时候提示空指针异常 检查发现Cache中cacheimpl没有初始化,又在我的ControllerTestCase中添加Cache.init()代码,重新运行ok。

附上代码:

/*---------------------ControllerTestCase-------------*/

package com.zfdzchina.mytest;

import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.common.base.Throwables;
import com.google.common.io.Files;
import com.jfinal.config.JFinalConfig;
import com.jfinal.core.JFinal;
import com.jfinal.handler.Handler;
import goja.Goja;
import goja.core.app.GojaConfig;
import goja.core.cache.Cache;
import goja.core.kits.reflect.Reflect;
import goja.initialize.ctxbox.ClassFinder;
import goja.test.mock.MockHttpRequest;
import goja.test.mock.MockHttpResponse;
import goja.test.mock.MockServletContext;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import javax.servlet.ServletContext;
import org.junit.AfterClass;
import org.junit.Before;

public abstract class ControllerTestCase {
    protected static ServletContext servletContext = new MockServletContext();
    protected static MockHttpRequest request;
    protected static MockHttpResponse response;
    protected static Handler handler;
    private static boolean configStarted = false;
    private static JFinalConfig configInstance;
    private String actionUrl;
    private String bodyData;
    private File bodyFile;
    private File responseFile;
    private Class<Goja> config;

    public ControllerTestCase() {
        Type genericSuperclass = this.getClass().getGenericSuperclass();
        this.config = Goja.class;
    }

    private static void initConfig(JFinal me, ServletContext servletContext, JFinalConfig config) {
        Reflect.on(me).call("init", new Object[]{config, servletContext});
    }

    public static void start(Class<Goja> configClass) throws Exception {
        if(!configStarted) {
            GojaConfig.init();
            ClassFinder.findWithTest();
            Reflect.on(Goja.class).call("initWithTest");
            JFinal me = JFinal.me();
            configInstance = (JFinalConfig)configClass.newInstance();
            initConfig(me, servletContext, configInstance);
            handler = (Handler)Reflect.on(me).get("handler");
            configStarted = true;
            configInstance.afterJFinalStart();
            Cache.init();
        }
    }

    @AfterClass
    public static void stop() throws Exception {
        configInstance.beforeJFinalStop();
    }

    public Object findAttrAfterInvoke(String key) {
        return request.getAttribute(key);
    }

    private String getTarget(String url, MockHttpRequest request) {
        String target = url;
        if(url.contains("?")) {
            target = url.substring(0, url.indexOf("?"));
            String queryString = url.substring(url.indexOf("?") + 1);
            String[] keyVals = queryString.split("&");
            String[] arr$ = keyVals;
            int len$ = keyVals.length;

            for(int i$ = 0; i$ < len$; ++i$) {
                String keyVal = arr$[i$];
                int i = keyVal.indexOf(61);
                String key = keyVal.substring(0, i);
                String val = keyVal.substring(i + 1);
                request.setParameter(key, val);
            }
        }

        return target;
    }

    @Before
    public void init() throws Exception {
        start(this.config);
    }

    public String invoke() {
        if(this.bodyFile != null) {
            List resp = null;

            try {
                resp = Files.readLines(this.bodyFile, Charsets.UTF_8);
            } catch (IOException var5) {
                Throwables.propagate(var5);
            }

            this.bodyData = Joiner.on("").join(resp);
        }

        StringWriter resp1 = new StringWriter();
        request = new MockHttpRequest(this.bodyData);
        response = new MockHttpResponse(resp1);
        Reflect.on(handler).call("handle", new Object[]{this.getTarget(this.actionUrl, request), request, response, new boolean[]{true}});
        String response = resp1.toString();
        if(this.responseFile != null) {
            try {
                Files.write(response, this.responseFile, Charsets.UTF_8);
            } catch (IOException var4) {
                Throwables.propagate(var4);
            }
        }

        return response;
    }

    public ControllerTestCase post(File bodyFile) {
        this.bodyFile = bodyFile;
        return this;
    }

    public ControllerTestCase post(String bodyData) {
        this.bodyData = bodyData;
        return this;
    }

    public ControllerTestCase use(String actionUrl) {
        this.actionUrl = actionUrl;
        return this;
    }

    public ControllerTestCase writeTo(File responseFile) {
        this.responseFile = responseFile;
        return this;
    }
}

/*-----------------------------我的测试类------------------------*/

public class ControllerTest extends ControllerTestCase {
    @Test
    public void test()
    {
        String result = use("/myctrl/area/province").invoke();
        System.out.println(result);
        TestCase.assertNotNull(result);
    }

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 1
码字总数 559
作品 0
合肥
程序员
私信 提问
ControllerTestCase 测试

@SogYF 你好,想跟你请教个问题: goja-test包中的ControllerTestCase测试要怎么用?简单继承的话,会提示:

大海无量1
2016/09/13
91
0
gojaES51 — Go 实现的 ECMAScript 5.1(+) 

goja 是一个 Go 实现的 ECMAScript 5.1(+)。它不是 V8 或 SpiderMonkey 或任何其他通用 JavaScript 引擎的替代品,因为它更慢。它可以作为一种嵌入式脚本语言使用,或者可以作为避免非 Go 相...

h4cd
2018/04/08
111
0
MVVM(微软的WPF基础)-MVC(常用模型/设计)-WPF(微软.NETFramework3.0

最近看 好多人说IOS MVC 过时了 要用MVVM 什么什么的,感觉 很新奇,就去搜了一下,发现原来所谓的MVVM就是 之前微软在10年左右就推出的WPF ,鄙人不才,搞过两年多的C#开发,因此 做了下比较...

RainOrz
2015/08/17
0
7
SwooleDistributed 1.7 发布,不需纠结同步和异步

SwooleDistributed 1.7更新 修复redis和mysql的一些bug,统一同步和异步的调用方法和回应结果的结构。redis基本所有的命令均已测试和统一。 增加了单元测试模块。 增加了mysql,redis,contr...

白_猫
2017/01/04
1K
3
ASP.NET MVC 认识

之前我不认识什么是mvc框架,我就在网上查找,我找到了一篇很好的文章,我看了之后就看懂了,通过这次小小的分享希望能帮到你! ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建...

myy629464
2017/12/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
2
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
1
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
3
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
2
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部