代码之家  ›  专栏  ›  技术社区  ›  Jean-François Côté

Play Framework 2.3中模型的单元测试

  •  1
  • Jean-François Côté  · 技术社区  · 9 年前

    我们最近从PlayFramework2.1迁移到2.3,一些单元测试停止工作。

    在这个特定的单元测试中,我使用了一个从ebean扩展Model的对象。我确保不使用ebean的任何函数(例如 find() , save() update() ).

    不幸的是,仅通过创建对象,我就得到了一个异常,因为它试图启动 Model.Finder 成员,我很确定它在迁移之前没有这样做。我如何克服这一问题?

    我的setUp函数在 new 呼叫

    @Before
    public void setUp() throws Exception {  
        SignageScheduleEntry allTheTimeSchedule = new SignageScheduleEntry();
    }
    

    我的对象本身,它在新模型上失败。调试单元测试时的查找器:

    public static Model.Finder<Long,SignageScheduleEntry> find = new Model.Finder<>(Long.class, SignageScheduleEntry.class);
    
        public SignageScheduleEntry() throws InvalidPeriodException {   
            ....
        }
    

    简而言之,我想在单元测试中使用没有ebean垃圾的对象,就像任何单元测试中的任何对象一样。我怎样才能做到这一点?

    谢谢

    1 回复  |  直到 9 年前
        1
  •  1
  •   Atif    9 年前

    如图所示: https://github.com/jamesward/play2torial/blob/master/JAVA.md#create-a-model

    您需要创建一个“fakeApplication”,如下所示:

    import org.junit.Test;
    
    import static play.test.Helpers.fakeApplication;
    import static play.test.Helpers.running;
    
    import static org.fest.assertions.Assertions.assertThat;
    
    import models.Task;
    
    public class TaskTest {
    
        @Test
        public void create() {
            running(fakeApplication(), new Runnable() {
                public void run() {
                    Task task = new Task();
                    task.contents = "Write a test";
                    task.save();
                    assertThat(task.id).isNotNull();
                }
            });
        }
    
    }
    

    如果这不起作用,或者如果这不是您想要的,那么另一种方法将更加复杂,与PlayJava文档不同: https://www.playframework.com/documentation/2.3.x/JavaTest#Unit-testing-models

    基本上,您必须为模型创建包装器,并在单元测试中模拟包装器。