文档章节

goja框架model和controller测试

 大海无量1
发布于 2016/09/30 15:24
字数 559
阅读 16
收藏 0
点赞 0
评论 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测试要怎么用?简单继承的话,会提示: Your ControllerTestCase must have genericType...

大海无量1
2016/09/13
51
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
Rails最佳实践--Models

Models很忙 方法: 把代码尽量往model里放。 理由: 1. 越底层越易复用。 2. Model是功能类,可更早测试。业务类如controller,直到攻城狮们宣布“我的代码写好了”,才能开始真正测试。 3....

阿昭
2012/04/12
0
0
ASP.NET MVC 认识

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

myy629464
2017/12/17
0
0
被误解的MVC和被神化的MVVM

被误解的 MVCMVC 的历史 MVC,全称是 Model View Controller,是模型 (model)-视图 (view)-控制器 (controller) 的缩写。它表示的是一种常见的客户端软件开发框架。 MVC 的概念最早出现在二...

刘波100
2016/08/22
7
0
界面之下:还原真实的 MVC、MVP、MVVM 模式

前言 做客户端开发、前端开发对MVC、MVP、MVVM这些名词不了解也应该大致听过,都是为了解决图形界面应用程序复杂性管理问题而产生的应用架构模式。网上很多文章关于这方面的讨论比较杂乱,各...

星仔小号
2016/01/14
187
0
ReactiveCocoa学习

版本 到我写这篇文章为止,ReactiveCocoa版本为5.0.1,搜了很多博客来了解ReactiveCocoa的基础用法,并不是很多,所以这篇文章算是自己对搜索资源的一个汇总,并加入一些自己在学习中遇到的问题和...

Sunxb
2017/04/11
0
0
MVC框架理解

我们先来看看什么是MVC? 全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业...

AngerCow
2017/12/14
0
0
RSPEC::RAILS介绍(翻译)

想有一下RSPec来做BDD开发,地发现中文资料太少了,无耐只能自己去主页上看资料,做为爱国者,俺的英文真烂得不成,不过翻完了,发出来大家乐一乐吧。 Spec::rails ------------------------...

阿昭
2010/12/01
0
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【JVM】JSTATD结合Java VisualVM进行远程监控JVM运行情况(二)

内存泄露指的是程序中动态分配内存给一些临时对象,但是对象不会被GC(java垃圾回收机制gabage collection)所回收,它始终占用内存。即被分配的对象很大但已无用; 内存溢出指的是程序运行过...

大白来袭
7分钟前
0
0
聊聊ribbon的超时时间设置

序 本文主要研究一下ribbon的超时时间设置 配置 实例 ribbon: ReadTimeout: 10000 ConnectTimeout: 10000 MaxAutoRetries: 0 MaxAutoRetriesNextServer: 1 eureka: enabled: ......

go4it
16分钟前
0
0
一行代码结果叹为观止,能做到这么极致的也只有python了

Python 这门语言非常的有趣,不仅可以做高大上的人工智能、大数据、机器学习。还可以用来做 Web、爬虫。还有其它很多的应用。今天我就给大家展示下一行 Python 代码都可以做些什么。 一行打印...

猫咪编程
19分钟前
1
0
KingShard使用

对于kingshard的功能,在git中可以看到明确的功能说明 主要功能: 1. 基础功能 支持SQL读写分离。 支持透明的MySQL连接池,不必每次新建连接。 支持平滑上线DB或下线DB,前端应用无感知。 支...

mickelfeng
21分钟前
0
0
Linux 下 查找某个字符串

如果你想在当前项目下 查找 "test" 这个字符串,可以这样: grep -rn "test" * * : 表示当前目录所有文件,也可以是某个文件名-r 是递归查找-n 是显示行号-R ...

nsns
21分钟前
0
0
数据结构 之 B树与红黑树

https://blog.csdn.net/v_july_v/article/details/6530142 http://www.cnblogs.com/CarpenterLee/p/5503882.html...

晨猫
21分钟前
0
0
Linux查看服务器总内存和总硬盘大小

一、linux CPU大小; 其实应该通过Physical Processor ID来区分单核和双核。而Physical Processor ID可以从cpuinfo或者dmesg中找到. flags 如果有 ht 说明支持超线程技术 判断物理CPU的个数可...

浮躁的码农
21分钟前
0
0
Postfix命令行说明

Postfix tips and Troubleshooting Commands Here's a list of stuff I user everyday and other email admins will also be using, Let me know if I missed anything List/Print current m......

mingle
28分钟前
0
0
是时候使用Helm了:Helm, Kubernetes的包管理工具

目前我们的一个产品共有4套环境:dev环境、test环境、staging环境、production环境。 其中dev, test, staging环境在一个Kubernetes集群上以不同namespace部署,production环境部署在另一个Kub...

xiaomin0322
35分钟前
0
0
常见的redis的序列化方式

概括 一般redis的序列化方式主要有:字符串序列化、json序列化、xml序列化、jdk序列化,具体可查阅org.springframework.data.redis.serializer.RedisSerializer 的实现类,其中对于json序列化...

菜蚜
49分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部