0

我一直在使用 JerseyTest 框架来测试我的应用程序中的端点。我对此很陌生。

我研究了我公司其他开发人员编写的其他一些测试用例。他们不直接测试 Resource 类,而是在测试用例中编写一个静态类并测试静态类。

即使在 Jersey Guide 中,我也注意到仅测试静态类的示例。

我不明白编写这样的测试用例的目的,因为我的目标是测试我的资源类,那么如果我们编写一个静态类并对其进行测试,我们将实现什么?

要测试的类如下

class SomeController {

@Post
@path("/someResponse")
private SomeResponseObject doSomeWork(@NotNull SomeObjectParameter parameter) {
   //Code for processing request and prepares the response object
   return someResponseObject;
}
}

但是在单元测试类中测试的类

public class SomeControllerTest extends JerseyTest {

@Path("/path")
public static class ControllerResource {
    @Post
    public SomeResponseObject getSomeWork() {
        //Prepared SomeResponseObject
        return someResponseObject;
    }
}

@Override
protected Application configure() {
    return new ResourceConfig(ControllerResource.class);
}

@Test
public void test() {
    SomeResponseObject response = target("hello").request().post(SomeResponseObject.class);
    //Do assertions
}
}

现在,如果您注意到 Configure 方法,则添加的类是在测试类中创建的静态类,而不是要测试的类 SomeController.class

如果我们不测试 SomeController 类,那么在这里编写单元测试有什么意义?我们想要达到什么目的?

4

2 回答 2

0

这是一个与 Jersey 测试框架一起使用的单元测试,它已经包含一个嵌入式容器,因此尝试测试资源本身并不需要实例化控制器类,它的成员无论如何都会被访问。

于 2017-06-07T04:03:16.660 回答
0

这是因为如果不是,Jersey 就无法创建它static。您将一个类传递给ResourceConfig,因此您告诉 Jersey 创建它的一个实例。如果您只是将它注册为实例,那么它不需要是静态的,因为 Jersey 不需要创建实例。

 return new ResourceConfig()
     .register(new ControllerResource());

我不认为无法创建它是泽西岛特有的东西。它与Java更相关。我能想到的所有其他框架都使用了内部类,它们都是一样的,比如 Spring 和 Jackson。内部类需要是静态的,框架才能创建实例。

顺便说一句,实际上没有任何理由将资源作为测试的内部类。我使用 Jersey Test Framework 发布了许多示例,我在测试中使用内部资源类的唯一原因是使示例自包含并按原样运行。通常,您的资源类将位于一个单独的文件中,不需要静态文件。

于 2017-06-07T05:31:53.807 回答