在没有正在运行的服务器的情况下测试WebService的响应代码

时间:2016-05-30 11:52:46

标签: java web-services testing junit

我想用JUnit(EasyMock和Hamcrest)测试我的WebService,而不必启动我的服务器(Wildfly)

private RegisterUserWebService testeee = new RegisterUserWebService();

@Test
  public void test() {

    // Set Mocks for testee
    // ...
    //

    Response response = testee.registerUser();
    verifyAll();
    assertThat(response.getStatusInfo().getStatusCode(), equalTo(Status.CONFLICT));

  }

我收到一个ClassNotFoundException:

java.lang.RuntimeException: java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl
            at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:152)
            at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:120)
            at javax.ws.rs.core.Response$ResponseBuilder.newInstance(Response.java:848)
            at javax.ws.rs.core.Response.status(Response.java:590)
            at javax.ws.rs.core.Response.status(Response.java:601)
            at my.package.webservices.RegisterUserWebService.registerUser(RegisterUserWebService.java:50)

据我了解,没有找到javax.ws.rs.core.Response的实现,默认的似乎是我没有的glassfish,因此是ClassNotFoundException。

我怎么能告诉我的测试使用Wildfly的响应? 或者还有另一种方式吗?

1 个答案:

答案 0 :(得分:1)

您似乎对单元测试有点误解:基本上,单元测试用于测试最小的单元测试。 构建时存在(如类,方法);所以换句话说:没有任何与真实文件系统,服务器,数据库等的连接。

这意味着,您可以使用JUnit来测试您准备的类#34;输入应该去某个地方;或者你可以测试处理一些"结果"来自某个地方。在这两种情况下,您可以使用模拟框架(如EasyMock或Mokito)来伪造为您的类提供输入的外部部件。

所以,有些伪代码可以告诉你什么可以工作:

RegisterUserWebService mockedService = ... create mock ...
Response mockedResponse = ... create mock ...
expect(mockedService.getStatusInfo() ...)
expect(mockedService.registerUser( params to match on )).andReturn(mockedResponse)

YourComponent underTest = new YourComponent ( mockedService )
underTest.doSomething()

verify ( that your mocks saw the calls you expected to happen )

其他任何东西都不是单元测试,而是功能/集成测试(因为它们需要其他组件启动并运行)

所以,你决定:你可以进行单元测试,但是你的范围会有所不同;或者你专注于在这里写功能测试。