Play Framework 2.5.x 测试环境搭建

Play Framework 2.5.x 测试环境搭建

目录

准备工作

  • Play 2.5.x Project Based on SBT

    • 自带 Junit 4.12
    • 自带 Guice 4.0
  • Mockito (2.2.11)

目标

搭建基于 Dependency Inject (使用 Guice) 的 PlayJava 工程的测试环境

GO

build.sbt

添加以下依赖:

libraryDependencies += "org.mockito" % "mockito-core" % "2.2.11" % "test"

设置 JavaOption:

javaOptions in Test ++= Seq(
  "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9998",
  "-Xms512M",
  "-Xmx1536M",
  "-Xss1M",
  "-XX:MaxPermSize=384M",
  "-Dconfig.resource=application.test.conf",
  "-Dlogger.resource=logback-test.xml"
)

conf/

在 build.sbt 中定义的 application.test.conf 和 logback-test.xml 要放置在工程根目录下的 conf/ 中。

如果不想 testcase 在 run 的过程中产生烦人的日志,在 logback-test.xml 中配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- SHUT THE LOG UP! -->
<configuration />

在 application.test.conf 配置文件中添加如下一行

application.global=TestGlobal

将 test 的 Global 跟 production 的 Global 区分开来。

TestGlobal

TestGlobal 类如下:

import play.Application;
import play.GlobalSettings;

/**
 * Created by STEPHEN on 06/12/17.
 */
public class TestGlobal extends GlobalSettings {
    private static final String TAG = TestGlobal.class.getSimpleName();

    @Override
    public void onStart(Application app) {

    }

    @Override
    public void onStop(Application app) {

    }
}

将 TestGlobal.java 文件放置在 工程根目录的 test/ 下。

应用

开发中的逻辑几乎都在 Service 层中,那么最常见的就是对 Service 进行 Unit Test。假设有两个类 – Service 和 Dao。 简单定义如下:

public class Service {
    @Inject
    private Dao dao;

    public Document getQualifiedUser(String uid) {
        Document user = dao.getUserById(uid);
        /* 针对这个 user 会有很多的处理,比如 validation 等等 */ 
        /* ... */
        /* 最终返回 user */
        return user;
    } 

}

public class DaoImpl implement Dao {
    private static SomeDB sdb = SomeDBFactory.get();

    @Override
    public Document getUserById(String uid) {
        return sdb.find(id=uid).one();
    }
}

针对这种常见的模型,可以进行如下的操作:

test/

在 test/ 下新建 servicetest/unittest/ServiceTest.java

内容如下:

abstract class ServiceTest {
    Dao dao;
    Injector injector;

    @Before
    public void setUp() throws Exception {
        dao = Mockito.mock(DaoImpl.class);

        injector = Guice.createInjector(new AbstractModule() {
            @Override
            protected void configure() {
                bind(Dao.class).toInstance(dao);
            }
        });
    }

    @After
    public void tearDown() throws Exception {
        injector = null;
        dao = null;
    }}

再建立真正的测试类:

public class SpecificServiceTest extends ServiceTest {

    @Test
    public void testGetUserById() {
        /* MOCK BEGIN */
        /* mock db queries one user */
        when(dao.getUserById(anyString()))
                .thenReturn(new Document("name", "stephen").append("age", 25));
        /* MOCK END */

        /* CALL BEGIN */
        Service service = injector.getInstance(Service.class);
        Document user = service.getQualifiedUser("13");
        /* CALL END */

        /* ASSERT BEGIN */
        assertEquals("stephen", user.getString("name"));
        assertEquals(25, user.getInt("age"));
        /* ASSERT END */
    }

}

在工程目录下,输入:

activator test

Ok!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值