在Java Play 2.4中测试具有模拟依赖项的控制器

时间:2015-07-17 05:15:32

标签: java unit-testing mockito playframework-2.4

我正在从2.37迁移我的Java play应用程序 - > 2.4.1。在我的控制器单元测试中,我在每次测试之前都设置了控制器及其相关的模拟依赖项。

似乎getControllerInstance方法已从Play 2.4中的GlobalSettings中删除,所以现在我无法覆盖它以返回我的控制器实例。

@RunWith(MockitoJUnitRunner.class)
public class PublicRoomsControllerTest extends WithApplication {

    @Mock
    private MyService myService;

    private MyController myController;

    @Before
    public void setUp() {
        myController = new MyController(myService);

        GlobalSettings global = new GlobalSettings() {

            public <T> T getControllerInstance(Class<T> clazz) {
                return (T) controller;
            }

        };

        start(fakeApplication(global));
    }

    @Test
    public void myTest() {
        Result result = route(new RequestBuilder().method(POST).uri("/test"));
        assertEquals(OK, result.status());
    }

}

我知道我可以直接在我的测试控制器实例上调用该方法,例如:

Result result = myController.someMethod();
assertEquals(OK, result.status());

这种方法似乎工作正常,直到someMethod()依赖于请求中的表单数据,如

 Map<String, String> data = Form.form().bindFromRequest().data();

测试是否有必要路由请求(可能包括表单数据)以使用我的控制器实例?

(我正在使用Guice,Mockito和JUnit)

1 个答案:

答案 0 :(得分:1)

我在这里指出https://github.com/playframework/playframework/issues/4876。在Play 2.4.x中执行此操作的正确方法是使用Helpers.invokeWithContext。因此,为了使用我的模拟依赖项来测试我的控制器,我使用了以下代码:

RequestBuilder requestBuilder = new RequestBuilder().bodyForm(ImmutableMap.of("userId", 1));
Result result = new Helpers().invokeWithContext(requestBuilder, () -> myController.someMethod());

旁注:我相信invokeWithContext将来会被改为静态方法。