使用异常映射器进行 Openejb Rest 集成测试

2024-02-24

我正在为我的 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 或类似的东西时我需要添加一些更多信息。

Thanks!


这个例子http://svn.apache.org/repos/asf/openejb/trunk/openejb/examples/rest-applicationcomposer/src/test/java/org/superbiz/composed/rest/GreetingServiceTest.java http://svn.apache.org/repos/asf/openejb/trunk/openejb/examples/rest-applicationcomposer/src/test/java/org/superbiz/composed/rest/GreetingServiceTest.java (via http://rmannibucau.wordpress.com/2012/09/13/use-mockito-with-openejb/ http://rmannibucau.wordpress.com/2012/09/13/use-mockito-with-openejb/;-)) 准确地显示了您想要的内容。

之后添加以下内容openejbJar.addEjbDeployment(...它应该有效。

final Properties properties = openejbJar.getEjbDeployment().iterator().next().getProperties();
properties.setProperty("cxf.jaxrs.providers", LogicalExceptionMapper.class.getName());

这是一个最小的工作示例(使用 openejb-cxf-rs 4.5.0 和 openejb-core 4.5.0):

import java.util.Properties;
import javax.ejb.Singleton;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.openejb.OpenEjbContainer;
import org.apache.openejb.config.EjbModule;
import org.apache.openejb.jee.EjbJar;
import org.apache.openejb.jee.StatelessBean;
import org.apache.openejb.jee.oejb3.EjbDeployment;
import org.apache.openejb.jee.oejb3.OpenejbJar;
import org.apache.openejb.junit.ApplicationComposer;
import org.apache.openejb.junit.Configuration;
import org.apache.openejb.junit.Module;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(ApplicationComposer.class)
public class RestWithExceptionMapper {

    @Configuration
    public Properties configuration() {
        return new Properties() {
            {
                setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, Boolean.TRUE.toString());
            }
        };
    }

    @Module
    public EjbModule app() {
        final StatelessBean bean = (StatelessBean) new StatelessBean(MyResource.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]));
        final Properties properties = openejbJar.getEjbDeployment().iterator().next().getProperties();
        properties.setProperty("cxf.jaxrs.providers", MyExceptionMapper.class.getName());
        final EjbModule module = new EjbModule(ejbJar);
        module.setOpenejbJar(openejbJar);
        return module;
    }

    public static class FooException extends RuntimeException {
    }

    public static class MyExceptionMapper implements ExceptionMapper<FooException> {

        @Override
        public Response toResponse(final FooException t) {
            return Response.ok("Objection!").build();
        }
    }

    @Path(value = "/test")
    public static class MyResource {

        @GET
        @Path(value = "/throw")
        public String throwException() {
            throw new FooException();
        }
    }

    @Test
    public void checkServiceWasDeployed() {
        assertEquals("Objection!", WebClient.create("http://localhost:4204/RestWithExceptionMapper").path("/test/throw").get(String.class));
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用异常映射器进行 Openejb Rest 集成测试 的相关文章

  • ScrollView 只能承载一个直接子级,但它只有一个

    每当我开始活动时 我都会收到此错误 这是完整的堆栈跟踪 Process com example PID 28799 java lang RuntimeException Unable to start activity ComponentI
  • java.rmi.NoSuchObjectException:表中没有这样的对象

    我正在编写一个非常简单的 RMI 服务器 并且我看到间歇性的java rmi NoSuchObjectExceptions在单元测试中 我对同一个对象进行了一串远程方法调用 虽然前几个调用成功 但后面的调用有时会失败 我没有做任何事情来取消
  • @TestPropertySource 不适用于 Spring 1.2.6 中使用 AnnotationConfigContextLoader 的 JUnit 测试

    似乎我在 Spring 4 1 17 中使用 Spring Boot 1 2 6 RELEASE 所做的任何事情都不起作用 我只想访问应用程序属性并在必要时通过测试覆盖它们 无需使用 hack 手动注入 PropertySource 这不行
  • 三层 Asp.Net 应用程序中的异常处理

    1 据我了解 在three tierAsp Net应用程序我们应该通过以下方式实现异常处理 a 我们应该把try catch围绕代码块 位于三层中的任何一层 我们希望页面能够从该代码块正常恢复 当此代码生成异常时 b 我们不应该放try c
  • Scala 中抛出异常,什么是“官方规则”

    我正在 Coursera 上学习 Scala 课程 我也开始阅读 Odersky 的 Scala 书 我经常听到的是 在函数式语言中抛出异常不是一个好主意 因为它破坏了控制流 并且我们通常返回一个失败或成功的 Either Scala 2
  • Bootstrap 工具提示“未捕获类型错误:无法读取 null 的属性‘触发器’”

    当我尝试显示新的工具提示时 在销毁旧工具提示后 我在 Chrome 控制台中收到 Uncaught TypeError Cannot read property trigger of null Then when I was digging
  • 如何单独捕获这些异常?

    我正在编写一个与 Quickbooks 交互的 Python 程序 连接到 Quickbooks 时 根据问题的不同 我可能会遇到以下两个常见异常之一 pywintypes com error 2147352567 Exception oc
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • C++,set_terminate 是每个线程本地的吗?

    Should set terminate get terminate在 C 2011 或 C 2003 中为多个线程设置不同的终止异常处理器 例如 如果我有程序并将终止处理程序设置为func 1 然后我启动3个线程 新线程中的终止处理程序是
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • 为什么 try catch 块没有捕获 Promise 异常?

    我对承诺的错误处理感到困惑 答案可能很明显 但我不明白 我有以下示例代码 var test async function throw new Error Just another error try test then catch err
  • 重新启动应用程序时出现异常 SIGKILL

    我在 iPhone 模拟器中构建并运行一个项目 我通过按主页按钮将其发送到后台 然后我双击主页按钮在后台找到我的应用程序并点击它 它变得活跃并且应用程序继续运行 在这里 无论我重复多少次 我都没有问题 然后我通过点击应用程序图标上的红色小减
  • Maven 不会运行测试

    跑步时mvn testmaven 不会运行所有测试类 当我通过添加显式提供一个类时 Dtest PropertyTests将运行测试 这是我的 pom xml
  • 如何将异常序列化为Json

    C 异常是 ISerialisable 因此它们不能也是 DataContract 因此我无法使用 JsonDataContractSerializer 将异常序列化为 JSON 的替代方案是什么 由于这个问题还没有真正得到解答 只需创建一
  • java异常处理策略[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • CompletableFuture 会吞掉异常吗?

    我一直在玩CompletableFuture并注意到一件奇怪的事情 String url http google com CompletableFuture
  • 运行使用wiremock存根的多个测试用例时“选择器循环等待选择”

    我在用着wiremock http wiremock org 用于模拟网络服务 我使用它来提供对我们正在测试的某些单元的服务访问 所以基本上我们有多个junit测试 它们使用来自wiremock的存根 但是 当我们一次运行多个测试 假设运行
  • 捕获特定的 WebException (550)

    假设我创建并执行一个System Net FtpWebRequest 我可以用catch WebException ex 捕获此请求引发的任何与 Web 相关的异常 但是 如果我有一些逻辑只想在由于以下原因引发异常时执行 550 file
  • CXF/Jetty 相当于以下 Jersey/Jetty 代码

    我有一些 Jersey 2 7 和 Jetty 9 2 5 v2014112 的测试代码 我正在尝试将其移植到 CXF 3 0 x 和 Jetty 相同版本 有一个部分我无法弄清楚 相当于rc register resource 下面一行
  • MongoDB:javascript执行失败:无法在 src/mongo/shell/collection.js 保存 DBQuery 对象

    在 MongoDb 中 当我尝试修改集合中的现有文档时 它会生成以下异常 javascript execution failed can t save a DBQuery object at src mongo shell collecti

随机推荐

  • 使用两个不同类型的 Guava ListenableFutures 的结果

    我有两个 ListenableFutures 它们在其他线程上完成 每个未来都有不同的类型 我希望在它们都完成时使用它们的结果 有没有一种优雅的方法来使用番石榴来处理这个问题 如果您想要某种类型安全 您可以执行以下操作 class Comp
  • 如何管理气流 dag 之间的 python 包?

    如果我有多个气流 dags 以及一些重叠的 python 包依赖项 我如何保留每个项目 deps 脱钩 例如 如果我在同一台服务器上有项目 A 和 B 我会用类似的东西运行它们 source path to virtualenv a act
  • 在 vue.js 中集成 Google 地图

    我一直在尝试在我的 vue js 项目上初始化 Google 地图 同时包含脚本 问题是我的 vue 文件看起来像这样
  • 3D 盒子上统一生成点

    我想在由 minx miny minz 和 maxx maxy maxz 角定义的 3D 盒子上生成随机点 我正在考虑在盒子内部生成一个随机点 然后以某种方式将其投影到盒子的一侧 但是 我没有盒子侧面的明确平面信息 这似乎不会产生均匀的点分
  • 特征问题:借用的数据逃逸到关联函数之外

    我正在尝试实现一个二叉树 我希望节点数据是分开的 因为有很多不同的方法可以实现这一点 而树上的算法应该是通用的并且独立于数据的存储方式 但我在借用检查器方面遇到了一个奇怪的问题 基本上 当我切换时impl
  • 自定义 GitHub Actions 中的新输出格式,因为 set-output 将被弃用

    根据 GitHub 最近的公告 github 行动的set output明年将被弃用 我能够使用新格式 echo name value gt gt GITHUB OUTPUT 在工作流程文件中 它可以工作 但我们也有一个用 python 编
  • 参数类型“PointerEvent”无法分配给参数类型“PointerDownEvent”

    最近我更新到了 flutter 2 5 和最新的 androids studio 并尝试将我的 flutter 项目编译到 android 设备 Android studio 向我抛出以下错误 如果我写flutter run在终端中编译到
  • 如何在java中使用StringToWordVector(weka)?

    这是我的arff文件 relation hamspam attribute text string attribute class ham spam data good ham very good ham bad spam very bad
  • 使 VBA 表单文本框仅接受数字(包括 +、- 和 .)

    我有简单的文本框 我想验证其输入 包括 和 这是我尝试过的 Private Sub DisplayValue TextBox Change If Not IsNumeric DisplayValue TextBox Value Then M
  • 学习 Web 开发时我应该使用框架吗

    我意识到这可能是主观的 但我确实需要一个答案 而且我似乎无法在论坛的其余部分中找到足够接近的答案 我读过一些人说框架 任何 MVC 框架 可能会掩盖太多的事情 而另一些人则说它可以促进良好的实践 我意识到框架对于一定水平的程序员来说非常有用
  • 替换公式中的文本时发现错误

    我发现了一个非常有趣的bug今天 即如果它是bug 您能确认一下是否可以复制吗 如果它是一个错误并且尚未报告 那么我可以将其归档 如果任何 Excel MVP 想要将其作为错误归档 我也可以接受 让我们说在sheet1在细胞内A1 你有一个
  • 求给定 Int 的总和但忽略重复的数字

    我不能使用数组或列表 我必须使用 C 重复意味着如果你有975444579它会显示25或者如果你有32111它会显示6并不是8 这是我的代码 include
  • Spring OAuth2 JDBCTokenStore 性能和数据库架构

    我使用 MySQL5 5 REST Jersey Spring Security Spring OAuth2 现在我正在做性能测试并注意到 org springframework security oauth2 provider token
  • F# 受歧视联合的限制

    我正在尝试将一个小型编译器从 C 移植到 F 以利用模式匹配和可区分联合等功能 目前 我正在使用基于 System Linq Expressions 的模式对 AST 进行建模 一个抽象基 Expression 类 每个表达式类型的派生类
  • 显示两个日期之间的所有日期数据;如果特定日期不存在行,则所有列中显示零

    我想显示两个日期之间的所有日期 当缺少任何日期数据时 它应该在 val 列中显示零 declare temp table id int identity 1 1 not null CDate smalldatetime val int 插入
  • 使用javascript设置图像源和背景图像

    我看过许多其他帖子 我认为我正在使用建议的确切语法 但是 我没有让图像显示出来 我有一个jsfiddle http jsfiddle net abalter An7r5 是jsfiddle的问题吗 它也无法在我正在开发的网站上运行 div
  • 固件:配置 orion 上下文代理端口

    我在用着Orion 上下文代理 http catalogue fi ware org enablers publishsubscribe context broker orion context broker但默认端口在我的组织中无效 防火
  • 为 UIImagePickerController 启用 HDR 选项

    是否可以在我的应用程序中启用 HDR 选项 我以为它会自动存在 我寻找了其他媒体类型 认为 kUTTypeHDRImage 可能是一个选择 但没有这样的运气 它不是额外的源类型 也不能通过cameraCaptureMode使用 ipc so
  • 如何在codeigniter中调用另一个控制器中的一个控制器函数

    我有一个名为home php其中一个函数名为podetails有没有 我想在另一个控制器中调用这个函数user php 可以这样做吗 我读过关于HMVC在CI中 但我想知道是否可以不使用hmvc 要扩展控制器 请按照此操作tutorial
  • 使用异常映射器进行 Openejb Rest 集成测试

    我正在为我的 jax rs 服务编写一些集成测试 其中我有一组异常映射器 因此 在执行给定请求时 我期望基于异常映射器的特定响应代码 问题是在这个环境中运行时我无法调用异常映射器 我的服务应该在我的测试中抛出逻辑异常 Stateless P