在 Java Play 2.4 中测试具有模拟依赖项的控制器
Testing a controller with mocked dependencies in Java Play 2.4
我正在从 2.37 -> 2.4.1 迁移我的 Java 播放应用程序。在我的控制器单元测试中,我在每次测试之前都设置了控制器及其关联的模拟依赖项。
似乎 getControllerInstance 方法已从 Play 2.4 中的 GlobalSettings 中删除,所以现在我无法将其覆盖到 return 我的控制器实例。
@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)
正如这里向我指出的那样 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 将来会更改为静态方法。
我正在从 2.37 -> 2.4.1 迁移我的 Java 播放应用程序。在我的控制器单元测试中,我在每次测试之前都设置了控制器及其关联的模拟依赖项。
似乎 getControllerInstance 方法已从 Play 2.4 中的 GlobalSettings 中删除,所以现在我无法将其覆盖到 return 我的控制器实例。
@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)
正如这里向我指出的那样 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 将来会更改为静态方法。