文档章节

goja框架model和controller测试

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

精选30+云产品,助力企业轻松上云!>>>

最近在研究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
合肥
程序员
私信 提问
加载中
请先登录后再评论。
基于golang的一些表达式引擎

Knetic-govaluate 参考资料https://github.com/Knetic/govaluate PaesslerAG-gval 参考资料https://github.com/PaesslerAG/gval google-cel-go 参考https://github.com/google/cel-go dop251......

osc_jtviy1jl
05/26
27
0
基于golang的一些表达式引擎

Knetic-govaluate 参考资料https://github.com/Knetic/govaluate PaesslerAG-gval 参考资料https://github.com/PaesslerAG/gval google-cel-go 参考https://github.com/google/cel-go dop251......

荣锋亮
05/25
0
0
super-graph 框架用到的几个不错的golang 包

viper 强大,通用的golang 配置管理工具,参考https://github.com/spf13/viper fasttemplate 高性能的模版引擎,同时作者的quicktemplate也很不错,参考http://github.com/valyala/fasttempl...

osc_zq2o0u6t
05/24
8
0
ControllerTestCase 测试

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

大海无量1
2016/09/13
174
0
sqler sql 转rest api 源码解析(一)应用的启动入口

sqler sql 转rest api 的源码还是比较简单的,没有比较复杂的设计,大部分都是基于开源 模块实现的。 说明: 当前的版本为2.0,代码使用go mod 进行包管理,如果本地运行注意golang 版本,我使...

osc_u8wox4co
2019/01/14
1
0

没有更多内容

加载失败,请刷新页面

加载更多

1Mn18Cr18N无磁护环强度高

1Mn18Cr18N高氮奥氏体不锈钢具有强韧性好、耐蚀性好、无磁等诸多优点,成为核主泵飞轮保持环材料的选择。 保持环的热套工序要求保持环材料具备优良的热膨胀性能,飞轮保持环完整性的保证要求...

无磁钢
34分钟前
14
0
比较器,Comparator与Comparable

Comparable比较器 从JDK1.2后提供了比较器的接口:Comparable接口。 public interface Comparable<T>{ /** * 实现对象的比较处理操作 * @param o 要比较的对象 * @return...

哼着我的小调调
46分钟前
9
0
以每种语言编译时,在C和C ++中都有效的代码能否产生不同的行为?

问题: C and C++ have many differences, and not all valid C code is valid C++ code. C和C ++有很多区别,并非所有有效的C代码都是有效的C ++代码。 (By "valid" I mean standard code w......

富含淀粉
50分钟前
7
0
使用getApplication()作为上下文的对话框抛出“无法添加窗口-令牌null不适用于应用程序”

问题: My Activity is trying to create an AlertDialog which requires a Context as a parameter. 我的活动试图创建一个AlertContext,它需要一个Context作为参数。 This works as expect......

法国红酒甜
今天
13
0
亚马逊测评买家号多开_可以解决这个问题嘛?_微信公众号: VMlogin中文版

对于很多亚马逊卖家来说,做亚马逊测评是并不可少的,都在为了自己的店铺能够获得更多的销售,着重培养自己产品的各项属性,以求获得一个更好的权重排名从而获得更多的曝光,但是在旺季期间亚...

竹节猫-ASOer
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部