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



我正在迁移我的Java播放应用程序从2.37 -> 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());

这种方法似乎工作得很好,直到someemethod()依赖于请求中的表单数据,如

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

是否有某种方式的测试路由请求,其中可能包括表单数据,使用我的控制器实例?

(我使用Guice, Mockito和JUnit)

正如在这里向我指出的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将被更改为静态方法

相关内容

  • 没有找到相关文章

最新更新