Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Play Framework 2.2.2-Java-使用模拟对象测试控制器_Java_Mocking_Playframework 2.2_Easymock - Fatal编程技术网

Play Framework 2.2.2-Java-使用模拟对象测试控制器

Play Framework 2.2.2-Java-使用模拟对象测试控制器,java,mocking,playframework-2.2,easymock,Java,Mocking,Playframework 2.2,Easymock,有人知道通过设置模拟对象来测试基于Java的Play Framework控制器的例子吗? 我在我的Play项目中使用Spring,所以我所有的控制器方法都不是静态的 通过测试传统的方式,Play显示我的控制器具有静态方法,我只是看不到如何将模拟注入到我的对象中 Result result = callAction( controllers.routes.ref.LoginController.authenticate(), fakeRequest().wi

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

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

Result result = callAction(
            controllers.routes.ref.LoginController.authenticate(),
        fakeRequest().withFormUrlEncodedBody(TestUtils.SUCCESSFUL_LOGIN_MAP)
    ); 
我有许多需要在LoginController中调用的服务,我想将它们设置为模拟

非常感谢您的帮助

谢谢
达米恩

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

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
可以(也可能必须)单独测试。

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