【问题标题】:Play Framework 2.2.2 - Java -Testing Controllers With Mock ObjectsPlay Framework 2.2.2 - Java - 使用模拟对象测试控制器
【发布时间】:2014-04-06 14:21:15
【问题描述】:

有人知道通过设置模拟对象来测试基于 Java 的 Play Framework 控制器的任何示例吗? 我在我的 Play 项目中使用 Spring,所以我的所有控制器方法都不是静态的。

测试传统方式,Play 将我的控制器显示为具有静态方法,我只是看不到如何将模拟注入到我的对象中

Result result = callAction(
            controllers.routes.ref.LoginController.authenticate(),
        fakeRequest().withFormUrlEncodedBody(TestUtils.SUCCESSFUL_LOGIN_MAP)
    ); 

我有许多服务需要在 LoginController 中调用,我想将它们设置为模拟

非常感谢任何帮助

谢谢 达米安

【问题讨论】:

  • 也许PowerMock 是你的朋友。它能够模拟对静态方法的调用,因此您可以模拟 LoginController 对象并添加对静态方法的调用的期望。
  • 谢谢丹。我可以通过不使用标准播放框架测试来解决这个问题,而只需像普通 bean 一样调用控制器来使用模拟对象

标签: java mocking playframework-2.2 easymock


【解决方案1】:

我一直在寻找相同问题的解决方案。到目前为止,我能够达到的最好结果是:

public class MyObjectControllerTest{

    private final MyObjectDAO dao = mock(MyObjectDAO.class);
    private final MyObjectController controller = new MyObjectController(dao);

    public static FakeApplication fakeApplication;

    @BeforeClass
    public static void startApp() {
        fakeApplication = Helpers.fakeApplication();
        Helpers.start(fakeApplication);
    }

    @AfterClass
    public static void stopApp() {
        Helpers.stop(fakeApplication);
    }

    @Test(expected = NotFoundException.class)
    public void testFailWithUnknownMyObjectKey() throws Throwable {
        when(dao.getByKey(any(UUID.class), any(UUID.class), any(Boolean.class))).thenReturn(null);
        controller.get(CassandraUUIDs.timeBased());
    }

    @Test
    public void testGetSuccess(){
        MyObject deletedObject = MyObjectTestGenerator.generateMyObject();
        deletedObject.setDeleted(true);
        when(dao.getByKey(any(UUID.class), any(UUID.class), any(Boolean.class))).thenReturn(deletedObject);

        try {
            Result result = controller.get(CassandraUUIDs.timeBased());
            assertThat(status(result)).isEqualTo(Http.Status.GONE);
            assertThat(contentType(result)).isEqualTo(Http.MimeTypes.JSON);
            assertThat(contentAsString(result)).isEqualTo(ErrorMsg.OBJECT_DELETED.toJson().toString());
        } catch (MyObjectsException e) {
            e.printStackTrace();
            fail("Failed to send MyObject.get request.");
        }
    }
}

我在这里做的是实例化控制器类的实例并传递模拟的 DAO 实例。请注意,我的代码中也没有使用静态控制器方法。

到目前为止,我发现此解决方法的一个问题是Action(我有自定义的)不起作用。但是Action 可以(并且可能必须)单独测试。

【讨论】:

    猜你喜欢
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多