在 Play Framework 中测试控制器

3

我正在使用Play框架,使用Java作为首选语言。我有一个控制器(Controller),它对外部服务进行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
@Kris,我该如何将路由器提供给Helpers创建的测试服务器? - Rishabh
抱歉,我从未尝试过在路由器上这样做。 - Kris
1个回答

4

控制器的测试最好通过继承WithApplication来完成。

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

为了测试控制器方法,请使用Helpers.fakeRequest和反向路由。外部服务可以使用mockito或其他你喜欢的mocking框架进行模拟。
你可以在这里找到几个例子。

非常感谢您的输入和提供链接。我会尝试一下。一旦我确认它按预期工作,我会将其标记为正确答案。 - Rishabh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接