在 Play 框架中测试控制器
Testing Controllers In Play Framework
我正在使用 Play Framework 并使用 Java 作为选择的语言。我有一个控制器,它对外部服务进行 REST 调用。我打算模拟外部服务,以便我可以测试我的控制器的功能。为此,我创建了如下所示的测试用例(样本)。我在我的测试中嵌入了一个服务器来模拟外部服务。
public class SomeControllerTest extends WithApplication {
private static Server SERVER;
@Override
protected Application provideApplication() {
final Module testModule = new AbstractModule() {
@Override
public void configure() {
bind(AppDao.class).to(MockAppDaoImpl.class);
}
};
return new GuiceApplicationBuilder().in(Environment.simple()).overrides(testModule).build();
}
@BeforeClass
public static void setup() {
Router router = new RoutingDsl()
.POST("/api/users")
.routeTo(() -> created())
.build();
SERVER = Server.forRouter(router, 33373);
PORT = SERVER.httpPort();
}
@AfterClass
public static void tearDown() {
SERVER.stop();
}
@Test
public void testCreateUser() {
ObjectNode obj = Json.newObject();
obj.put("name", "John Doe");
obj.put("email", "john.doe@example.com");
Http.RequestBuilder request = new Http.RequestBuilder()
.method(POST)
.bodyJson(obj)
.uri("/some/url/here");
Result result = route(request);
assertEquals(ERR_MSG_STATUS_CODE, CREATED, result.status());
assertEquals(ERR_MSG_CONTENT_TYPE, Http.MimeTypes.JSON, result.contentType().get());
}
我的期望是,当我 运行 测试时,模拟服务器会 运行 并且基于我的应用程序的测试配置,我的控制器将调用模拟服务器 return 201
并且我的测试用例会通过。
但是,这不会发生,因为一旦 setup()
方法完成,模拟服务器就会被终止,我的控制器无法调用它。
我做错了什么?
控制器的测试应该通过从 WithApplication 继承来完成
public class TestController extends WithApplication {
@Test
public void testSomething() {
Helpers.running(Helpers.fakeApplication(), () -> {
// put test stuff
// put asserts
});
}
}
为了测试控制器方法,请使用 Helpers.fakeRequest 和反向路由。
外部服务可能只是用 mockito 或您喜欢的其他模拟框架来模拟。
您可以找到 here 几个示例。
我正在使用 Play Framework 并使用 Java 作为选择的语言。我有一个控制器,它对外部服务进行 REST 调用。我打算模拟外部服务,以便我可以测试我的控制器的功能。为此,我创建了如下所示的测试用例(样本)。我在我的测试中嵌入了一个服务器来模拟外部服务。
public class SomeControllerTest extends WithApplication {
private static Server SERVER;
@Override
protected Application provideApplication() {
final Module testModule = new AbstractModule() {
@Override
public void configure() {
bind(AppDao.class).to(MockAppDaoImpl.class);
}
};
return new GuiceApplicationBuilder().in(Environment.simple()).overrides(testModule).build();
}
@BeforeClass
public static void setup() {
Router router = new RoutingDsl()
.POST("/api/users")
.routeTo(() -> created())
.build();
SERVER = Server.forRouter(router, 33373);
PORT = SERVER.httpPort();
}
@AfterClass
public static void tearDown() {
SERVER.stop();
}
@Test
public void testCreateUser() {
ObjectNode obj = Json.newObject();
obj.put("name", "John Doe");
obj.put("email", "john.doe@example.com");
Http.RequestBuilder request = new Http.RequestBuilder()
.method(POST)
.bodyJson(obj)
.uri("/some/url/here");
Result result = route(request);
assertEquals(ERR_MSG_STATUS_CODE, CREATED, result.status());
assertEquals(ERR_MSG_CONTENT_TYPE, Http.MimeTypes.JSON, result.contentType().get());
}
我的期望是,当我 运行 测试时,模拟服务器会 运行 并且基于我的应用程序的测试配置,我的控制器将调用模拟服务器 return 201
并且我的测试用例会通过。
但是,这不会发生,因为一旦 setup()
方法完成,模拟服务器就会被终止,我的控制器无法调用它。
我做错了什么?
控制器的测试应该通过从 WithApplication 继承来完成
public class TestController extends WithApplication {
@Test
public void testSomething() {
Helpers.running(Helpers.fakeApplication(), () -> {
// put test stuff
// put asserts
});
}
}
为了测试控制器方法,请使用 Helpers.fakeRequest 和反向路由。 外部服务可能只是用 mockito 或您喜欢的其他模拟框架来模拟。
您可以找到 here 几个示例。