其中一些是我的猜测和猜测,但它可能会有所帮助。您可以尝试使用Jersey 测试InMemoryTestContainerFactory
框架:
它启动 Jersey 应用程序并直接调用内部 API 来处理由测试框架提供的客户端创建的请求。不涉及网络通信。此容器不支持 servlet 和其他容器相关功能,但它是简单单元测试的完美选择。
它看起来像使用它,您需要做的就是扩展JerseyTest
然后覆盖getTestContainerFactory()
并按照其余说明进行操作,例如:
public class EmployeeResourceTest extends JerseyTest {
@Override
protected Application configure() {
// set up employee resource with mock dependencies etc...
return new ResourceConfig().registerInstances(employeeResource);
}
@Test
public void getAllEmployees() {
final String response = target("getallemployees").request().get(String.class);
// assert etc...
}
}
我使用了 inregisterInstances
而不是registerClasses
in,configure()
因为它看起来像你可以展示一个现成的Resource
但设置了你可能想要的任何模拟依赖项——尽管我自己没有尝试过。
测试类有点不灵活,因为您只能在方法中一次性设置依赖项configure()
,因此可能值得研究使用MockitoJUnitRunner
- 尽管我不确定它是否适用于JerseyTest
继承。它可以允许您在每个@Test
方法中为模拟添加行为,例如:
@Mock
private EmployeeResourceDependency dependency;
@InjectMocks
private EmployeeResource employeeResource;
// configure() as above but without mock setup up etc...
@Test
public void getAllEmployees() {
given(dependency.getEmployees()).willReturn(...);
// etc...
但就像我说的那样,可能根本无法混合它们。