例外マッパーのセットがあるjax-rsサービスに向けていくつかの統合テストを書いています。したがって、特定のリクエストを実行する場合、例外マッパーに基づく特定の応答コードを期待します。問題は、この環境で実行しているときに例外マッパーを呼び出せないことです。
私のテストで論理的な例外をスローするはずの私のサービス:
@Stateless
@Path("/baseCustomer")
public class BaseCustomerService {
@EJB //this one gets mocked in the unittest
private BaseCustomerManagerBean customerManager;
@POST
@Path("crud")
@Consumes({MediaType.APPLICATION_XML})
@Produces({MediaType.APPLICATION_XML, MediaType.TEXT_XML})
public Hkunde createCustomer(Hkunde newCustomer) throws LogicalException {
//throws exception according to mocking
return customerManager.createCustomer(newCustomer);
}
そして例外マッパー:
@Provider
public class LogicalExceptionMapper implements ExceptionMapper<LogicalException> {
@Override
public Response toResponse(LogicalException exception) {
return Response.status(Response.Status.FORBIDDEN).build();
}
}
私は次のようにテストを設定しました。
@Mock
private BaseCustomerManagerBean baseCustomerManager;
private HttpClient httpClient;
private BaseCustomerServiceClient client;
@Configuration
public Properties config() throws Exception {
Properties properties = new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, Boolean.TRUE.toString());
properties.setProperty(DeploymentFilterable.CLASSPATH_INCLUDE, LogicalExceptionMapper.class.getName());
properties.setProperty("openejb.jaxrs.providers.auto", "true");
properties.setProperty("openejb.servicemanager.enabled", "true");
return properties;
}
@MockInjector
public Class<?> mockitoInjector() {
return MockitoInjector.class;
}
@Module
public EjbModule createModule() throws Exception {
final StatelessBean bean = (StatelessBean) new StatelessBean(BaseCustomerService.class).localBean();
bean.setRestService(true);
final EjbJar ejbJar = new EjbJar();
ejbJar.addEnterpriseBean(bean);
final OpenejbJar openejbJar = new OpenejbJar();
openejbJar.addEjbDeployment(new EjbDeployment(ejbJar.getEnterpriseBeans()[0]));
EjbModule module = new EjbModule(ejbJar);
module.setOpenejbJar(openejbJar);
return module;
}
@Module
public Class[] exceptionMappers() {
return new Class[]{LogicalExceptionMapper.class};
}
@Before
public void setup() {
ServiceHost serviceHost = new ServiceHost("http://localhost:4204/BaseCustomerServiceTest");
httpClient = new HttpClient(serviceHost);
client = new BaseCustomerServiceClient(httpClient);
}
@Test
public void createCustomer_givenLogicalException_expectsLogicalException() throws LogicalException {
Hkunde expected = new Hkunde(true);
when(baseCustomerManager.createCustomer(expected)).thenThrow(new LogicalException("mock"));
try {
client.createCustomer(expected);
fail("Expected LogicalException");
} catch (LogicalException ex) {
}
verify(baseCustomerManager).createCustomer(expected);
}
したがって、テストを実行するclient
と、応答から応答コードを読み取り、このコードに基づいて例外をスローします。
問題は、例外マッパーが呼び出されることがなく、「禁止」応答ではなく、常に500の内部サーバーエラーを受け取ることです。ejbjarなどを設定するときに、さらに情報を追加する必要があると思います。
ありがとう!