我想用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的响应? 或者还有另一种方式吗?
答案 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 )
其他任何东西都不是单元测试,而是功能/集成测试(因为它们需要其他组件启动并运行)
所以,你决定:你可以进行单元测试,但是你的范围会有所不同;或者你专注于在这里写功能测试。