Я смог использовать тестовую структуру трикотажа для тестирования моего JAX-RS restful api. Однако я не могу заставить EJB правильно издеваться над тем, что я пытаюсь сделать.Mocking EJB with Mockito and Jersey Framework Framework
Используя пример, предоставленный @peeskillet, точка, на которую ссылается мой EJB в ресурсе, остается пустой.
Так что я знаю, что это не мои зависимости. Я считаю, что проблема в том, что я вложен EJB. Есть несколько факторов, которые, я уверен, могут влиять на поведение этого кода, но я не уверен, как обращаться: 1. Моя ApplicationService, которую я пытаюсь высмеять, - это интерфейс, и у меня есть класс ApplicationServiceImpl который имеет в себе фактическую логику. Поскольку мой тест НЕ сфокусирован на этой логике, мой мыслительный процесс насмехался, интерфейс должен быть достаточным. 2. Однако реализация интерфейса также содержит EJB, который подключается к Singleton MongoDB.
Итак, мои вопросы: Может ли какой-либо из этих факторов играть здесь роль в том, почему ссылка на интерфейс в моем классе ресурсов всегда равна нулю, что явно не может насмехаться и вводить? Если да, то как мне это исправить?
Если мне нужно переключиться на издевательство над реализацией напрямую, а не с интерфейсом, то мне также нужно высмеять DAO ejb?
Чтобы быть ясным, работа с тестовым фреймом работает абсолютно нормально, если я не называю какие-либо методы, которые полагаются на поля/объекты, вводимые через EJB. Класс
Мой ресурс
@Path("/stats")
@Api(value = "stats", authorizations = {
@Authorization(value = "apiKey", scopes = {})
})
@Stateless
@Produces({MediaType.APPLICATION_JSON})
public class StatsResource {
private final static Logger LOG = Logger.getLogger(StatsResource.class.getName());
@EJB
ApplicationService applicationService;
public void setApplicationService(ApplicationService applicationService) {
this.applicationService = applicationService;
}
@GET
public String getHere(){
return "Got Here!";
}
@GET
@Path("test")
@ApiOperation(value = "Finds all applications",
notes = "Returns brief display which uses a limited subset of Application.class fields",
response = Application.class,
responseContainer = "List<Application>"
)
@JsonView(Views.Brief.class)
@Asynchronous
public void getApplications(@Suspended
final AsyncResponse asyncResponse) throws Exception {
asyncResponse.resume(doGetApplications());
}
private ApplicationList doGetApplications() throws Exception {
return new ApplicationList(applicationService.getAll());
}
}
Мой тест Case
public class StatsResourceNGTest extends JerseyTestNg.ContainerPerMethodTest {
@Mock
private ApplicationService applicationService;
@Override
protected Application configure() {
enable(TestProperties.LOG_TRAFFIC);
enable(TestProperties.DUMP_ENTITY);
MockitoAnnotations.initMocks(this);
Logger.getLogger(StatsResourceNGTest.class.getName()).log(Level.INFO, "Mock App Service: {0}", applicationService.toString());
AbstractBinder binder = new AbstractBinder() {
@Override
protected void configure() {
bindFactory(MockApplicationServiceFactory.class)
.to(ApplicationResource.class);
}
};
ResourceConfig config = new IdentityRestApplication(true);
config.register(binder);
config.register(StatsResource.class);
return config;
}
@Test
public void assertMockInjectionWorked() throws Exception {
Response response = target("/stats/test").request(MediaType.APPLICATION_JSON).get();
verify(applicationService, times(1)).getAll();
Logger.getLogger(ApplicationResourceNGTest.class.getName()).log(Level.INFO, "Status: {0}", response.getStatus());
String msg = response.readEntity(String.class);
Logger.getLogger(ApplicationResourceNGTest.class.getName()).log(Level.INFO, "Response: {0}", msg);
Assert.assertNotNull(msg);
response.close();
}
}
Мои HK2 MockFactory
public class MockApplicationServiceFactory implements Factory<ApplicationService> {
private List<Application> appList;
@Override
public ApplicationService provide() {
appList = new ArrayList<>();
for (int i = 1; i < 6; i++) {
String appname = "App " + i;
Application app = new ApplicationBuilder()
.setName(appname)
.setDescription(appname + " Description")
.setTenantId(new ObjectId())
.createApplication();
appList.add(app);
}
try {
final ApplicationService mockedService = Mockito.mock(ApplicationService.class);
Mockito.when(mockedService.getAll()).thenReturn(appList);
return mockedService;
} catch (ApplicationException ex) {
Logger.getLogger(ApplicationResourceNGTest.class.getName()).log(Level.SEVERE, null, ex);
} catch (Exception ex) {
Logger.getLogger(ApplicationResourceNGTest.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
@Override
public void dispose(ApplicationService t) {
}
}
--redacted-- левый в неправильном месте. –