【问题标题】:Testing Controllers In Play Framework在 Play 框架中测试控制器
【发布时间】:2016-11-14 04:31:22
【问题描述】:

我正在使用 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());
}

我的期望是,当我运行测试时,模拟服务器将运行,并且基于我的应用程序的测试配置,我的控制器将调用模拟服务器,该服务器将返回 201,我的测试用例将通过。 但是,这不会发生,因为一旦 setup() 方法完成,模拟服务器就会被杀死,我的控制器无法调用它。

我在这里做错了什么?

【问题讨论】:

  • 或许你可以使用Helpers.testServer();获取服务器,然后Helpers.start(server);启动一个。
  • @Kris 如何将路由器提供给 Helpers 创建的测试服务器?
  • 抱歉,没试过用路由器。

标签: java unit-testing playframework mocking integration-testing


【解决方案1】:

控制器的测试应该通过从WithApplication继承来完成

public class TestController extends WithApplication {
   @Test  
   public void testSomething() {  
       Helpers.running(Helpers.fakeApplication(), () -> {  
           // put test stuff  
           // put asserts  
       });
   }  

}

为了测试控制器方法,请使用 Helpers.fakeRequest 和反向路由。 外部服务可能只是使用 mockito 或您喜欢的其他模拟框架进行模拟。

你可以找到here几个例子。

【讨论】:

  • 感谢您的意见和链接。我将不得不尝试一下。一旦我发现它按预期工作,我会将其标记为正确答案。
猜你喜欢
  • 1970-01-01
  • 2020-05-07
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多