我有一个资源端点,它将@PathParam注入构造函数,即每个@PathParam值都有不同的实例。在Jetty一切正常。但现在我尝试使用Jersey Test Framework编写单元测试,似乎测试框架每个类型只支持一个注册端点。
所以,如果我做这样的事情:
@Path("/users")
public class MyResource {
public MyResource(@PathParam("userId") int userId) {
}
@Path("{userId}")
public String get() {
}
}
public class MyTest extends JerseyTestNg.ContainerPerClassTest {
@Override
protected Application configure() {
return new ResourceConfig()
.register(new MyResource(1))
.register(new MyResource(2));
}
@Test
public void test2() {
target("/users/1").request().get();
}
@Test
public void test2() {
target("/users/2").request().get();
}
}
我看到test1和test2都在调用MyResource(1)的实例。这是预期的吗?是否有调用正确实例的解决方案?
答案 0 :(得分:1)
您应该将资源注册为类。泽西岛将为您创造它。并处理所有注射。
“我发布的示例是愚蠢的。实际上,我的资源构造函数有另一个注入的对象,我需要模拟。那么如何为构造函数指定一个模拟对象参数?”
您可以执行类似
的操作@Mock
private Service service;
@Override
public ResourceConfig configure() {
MockitoAnnotations.initMocks(this);
return new ResourceConfig()
.register(MyResource.class)
.register(new AbstractBinder() {
@Override
protected configure() {
bind(service).to(Service.class);
}
});
}
@Test
public void test() {
when(service.getSomething()).thenReturn("Something");
// test
}
假设您已经在使用内置的HK2 DI,并且在资源类的构造函数上有一个@Inject
注释,这应该可行。在AbstractBinder
我们正在使模拟对象可注入。所以现在泽西可以把它注入你的资源。
另见: