希望你能帮我解决一些我已经挣扎了一段时间的问题。我正在使用arquillian进行集成测试,它运行得非常好。所以我想,与其测试我的持久性层,不如隔离我的rest服务层来测试它。这次使用arquillian,arquillianrest扩展(http://arquillian.org/modules/rest-extension/)这听起来非常适合我的服务层的黑盒测试,并将其与mockito相结合。
我的应用程序从上到下有几个层:
- ui(javascript)
- 交互层(使用resteasy的Rest服务)
- 业务层(无状态EJB)
- 持久层
All部署在javaee6容器中并使用该技术。
为了测试包含rest服务的交互层,我使用了arquillian rest扩展,它避免了在代码中设置httpclient和调用rest调用的麻烦。这一切都是通过使用arquillian rest扩展来完成的,这听起来很棒,不是吗!?
我的rest服务注入了几个CDI bean,它们代表业务层。为了避免一次测试所有层,我希望使用mock隔离其余层。所以我尝试使用mockito,它可以模拟rest层中注入的bean。不幸的是,我的mock在测试中起作用,但mock没有插入到我的rest服务中。
为了解决这个问题,我偶然发现了另一个名为autodiscover的arquillian扩展,但不知道该做什么或配置什么才能让mock在我的项目中工作。
希望你们能帮我。
事实上,当运行黑盒测试(如rest调用或基于硒的测试)时,mockito无论是自动发现还是字节扩展都将帮助您,因为您的测试是在容器外部驱动的,并且您只能在部署的内容上中继。
一种替代方案是部署虚假服务,例如,如果您有这样的休息端点:
@Path("rest")
public void MyEndpoint{
@Inject
RealService realService;
@Path("rest-resource")
@GET
public Response methodUnderTest(){
realService.doSomething();
return Response.ok().build();
}
}
在您的测试@Deployment中,您可以添加FakeService而不是RealService,其中FakeService是CDI替代方案或Bean专业化,我在博客上写过关于arquillian和mocks的文章,您可以在这里阅读文章。