[英]Jersey Test + HK2 + Inject Factory service
我正在嘗試在Jersey測試類中注入HK2工廠服務提供的對象,但是得到不滿意的依賴項異常。
我有如下的工廠服務
public class TestFactory implements Factory<TestObject>{
private final CloseableService closeService;
@Inject
public TestFactory(CloseableService closeService) {
this.closeService = closeService;
}
@Override
public TestObject provide() {
TestObject casualObject = new TestObject();
this.closeService.add(() -> dispose(casualObject));
return casualObject;
}
@Override
public void dispose(TestObject instance) {
instance.destroy();
}
}
還有澤西測試班
public class SampleTestCass extends JerseyTestNg.ContainerPerClassTest
{
//@Inject
private TestObject myTestObject;
private ServiceLocator locator;
@Override
protected Application configure()
{
ResourceConfig resConfig = new ResourceConfig(MyApi.class);
resConfig.register(getBinder());
locator = setupHK2(getBinder());
return resConfig;
}
// setup local hk2
public setupHK2(AbstractBinder binder)
{
ServiceLocatorFactory factory = ServiceLocatorFactory.getInstance();
ServiceLocator locator = factory.create("test-locator");
DynamicConfigurationService dcs = locator.getService(DynamicConfigurationService.class);
DynamicConfiguration dc = dcs.createDynamicConfiguration();
locator.inject(binder);
binder.bind(dc);
dc.commit();
return locator;
}
// get the binder
public AbstractBinder getBinder()
{
return new AbstractBinder() {
@Override
protected void configure() {
bindFactory(TestFactory.class, Singleton.class).to(TestObject.class).in(PerLookup.class);
}
}
}
@BeforeClass
public void beforeClass()
{
myTestObject = locator.getService(TestObject.class);
// use myTestObject
}
@AfterClass
public void afterClass()
{
if (locator != null) {
locator.shutdown();
}
}
@Test()
public void someTest()
{
// some test code...
}
}
並獲得例外
MultiException具有3個異常。 他們是:
CloseableService
是澤西應用程序內提供的服務。 您創建的ServiceLocator
未綁定到Jersey應用程序。 它只是一個獨立的定位器。 因此,嘗試使用此定位器注冊TestFactory
會導致它失敗,因為沒有CloseableService
。 您在ResourceConfig
注冊的那一個就可以了。
不確定要執行的操作是什么,但是如果要在測試中訪問服務,則可以做的一件事就是將服務作為實例綁定,例如
class MyTest {
private Service service;
@Override
public ResourceConfig configure() {
service = new Service();
return new ResourceConfig()
.register(new AbstractBinder() {
@Override
public void configure() {
bind(service).to(Service.class);
}
})
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.