有人知道通过设置模拟对象来测试基于 Java 的 Play Framework Controller 的示例吗? 我在我的 Play 项目中使用 Spring,所以我所有的 Controller 方法都不是静态的。
测试传统方式,Play 将我的 Controller 显示为具有静态方法,但我只是看不到如何将模拟注入(inject)我的对象的方法
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.");
}
}
}
我在这里所做的是实例化 Controller 类的实例并传递模拟的 DAO 实例。请注意,我也没有在我的代码中使用静态 Controller 方法。
到目前为止,我发现此解决方法的一个问题是 Action
(我有自定义的)无法正常工作。但是 Action
可以(而且可能必须)单独测试。
关于java - Play Framework 2.2.2 - Java - 使用模拟对象测试 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22895293/