为什么在使用Jersey Test时只使用静态类来测试休息端点?

时间:2017-06-06 19:06:57

标签: java rest junit jersey jersey-test-framework

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

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

即使在Jersey指南中,我也注意到只测试静态类的例子。

我不明白编写这样的测试用例的目的是因为我的目标是测试我的资源类,那么如果我们编写一个静态类并测试它会得到什么呢?

要测试的课程

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类,那么在这里编写单元测试有什么意义呢?我们想要实现什么目标?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

我认为不能创造它是泽西特有的。它与Java更相关。我能想到的所有其他框架,我都使用过内部类,就像Spring和Jackson一样。内部类需要是静态的,以便框架创建实例。

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