如何使用 Jersey 2 测试框架为此类编写单元测试

2023-12-03

我正在尝试为 Rest api 调用编写单元测试,该调用具有 POST 方法,用于使用 Jersey2 将视频文件添加到基于 Web 的应用程序。这是我的类方法的签名(TemplateController.java)我想为其编写单元测试:

@POST
@Path("/video/add")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response addVideoData(
    @Context HttpServletRequest request, 
    AttachmentDTO attachmentDTO) {
        ...
}

这是我的测试类的测试方法(TemplateControllerUnitTestCase.java):

@Test
public void videoAdd_requestObjectIsNull_ResponseStatusIsOK() throws Exception {
    // arrange
    Builder builder = target("/target/video/add").request();
    // action
    final Response response = builder.post(Entity.entity(attachemntDTO, MediaType.APPLICATION_JSON));
    // assertion
    ...
}

我能够通过AttachmentDAO反对TemplateController来自测试类的类,但无法传递请求对象,该对象在method(addVideoData()) of the TemplateController.java class.

我在用着RequestHelper类是一个辅助类HttpServletRequest,所以我想将这个类的一个对象传递给method(addVideoData())使用 Jersey2 测试框架。


您可以使用HK2Jersey 2 的功能,有助于依赖注入。通过这种方式,您可以创建一个Factory for HttpServletRequest并从你的返回模拟RequestHelper。例如

public class HttpServletRequestFactory implements Factory<HttpServlet> {

    @Override
    public HttpServletRequest provide() {
       return RequestHelper.getMockServletRequest();
    }

    @Override
    public void dispose(HttpSession t) {
    }
}

然后在你的JerseyTest子类,只需注册一个AbstractBinderResourceConfig。例如

@Override
public Application configure() {
    ResourceConfig config = new ResourceConfig(...);
    config.register(new AbstractBinder(){
        @Override
        public void configure() {
            bindFactory(HttpServletRequestFactory.class).to(HttpServletRequest.class);
        }
    });
} 

另外一个选择

...就是不要嘲笑HttpServletRequest并使用实际的HttpServletRequest。为此,我们需要配置DeploymentContext当我们重写getDeploymentContext(),并返回一个ServletDeploymentContext。你可以看一个例子here and here。第一个也有一个使用的例子Factory,而第二个则显示如何基于 web.xml 设置进行配置的示例。如果你选择这个案例来嘲笑HttpServletRequest, 然后你wouldn't需要覆盖getTestContainerFactory and configureDeployment如示例中所示。只需使用Application configure()override 就足够了,只要不依赖 servlet 功能即可。

链接中的示例使用

<dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
    <version>${jersey.version}</version>
</dependency>

Extra

我链接到的两个示例都试图利用 Sevlet 功能。因此,我将给出一个使用请求模拟的完整示例。

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import org.glassfish.hk2.api.Factory;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Assert;
import org.junit.Test;

public class MockHttpSevletRequestTest extends JerseyTest {

    @Path("http")
    public static class HttpResource {
        @GET
        public Response getResponse(@Context HttpServletRequest request) {
            return Response.ok(request.getMethod()).build();
        }
    }

    @Override
    public Application configure() {
        ResourceConfig config = new ResourceConfig(HttpResource.class);
        config.register(new AbstractBinder() {
            @Override
            public void configure() {
                bindFactory(HttpServletRequestFactory.class)
                        .to(HttpServletRequest.class);
            }
        });
        return config;
    }

    public static class HttpServletRequestFactory implements Factory<HttpServletRequest> {

        @Override
        public HttpServletRequest provide() {
            return new MockHttpServletRequest();
        }

        @Override
        public void dispose(HttpServletRequest t) {
        }
    }

    @Test
    public void test() {
        String response = target("http").request().get(String.class);
        System.out.println(response);
        Assert.assertEquals("POST", response);
    }
}

MockHttpServletRequest是一个简单的虚拟实现HttpServletRequest我只重写一种方法getMethod()并始终返回POST。从结果中可以看出,尽管这是一个get请求,它仍然返回POST

public class MockHttpServletRequest implements HttpServletRequest {

    @Override
    public String getMethod() {
        return "POST";
    }
    ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Jersey 2 测试框架为此类编写单元测试 的相关文章

  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐

  • 未捕获的错误:spawn .\node.exe ENOENT

    我有一个通过 Electron 运行的 NodeJS 应用程序 https github com frankhale electron with express 使用以下命令将应用程序打包为可执行文件后npm run dist win32
  • 如何在 Swift 中将 NSObject 类对象转换为 JSON?

    I have var contacts ContactsModel and class ContactsModel NSObject var contactEmail String var contactName String var co
  • 在代码隐藏中更改文本框中的文本时,文本不会立即更新

    在下面的简化代码中 我希望在获取结果时文本框显示 请稍候 然而它永远不会出现 而是文本框只显示结果functionThatTakesASecondOrTwoToRun xaml
  • Aptana studio 3 无法联系 download.ecplise.org [已关闭]

    Closed 这个问题是无关 目前不接受答案 我想安装一个新插件 但我不能 因为 aptana 无法到达 download ecplise org 上的存储库 超时 也许是镜像挂了 有办法重置存储库缓存吗 还有其他方法可以获取缺少的插件吗
  • Android Studio 64 位错误:32 位 Linux Android 模拟器二进制文件已弃用

    我最近将我的 ubuntu 13 10 64 位升级到 14 04 64 位 Android Studio 在 13 10 上始终运行良好 在 14 04 上 我遇到了 gradle 问题 this one 这是缺少 libz so 1 的
  • 在命令提示符下打开 Sqlite Db

    朋友们 我正在研究 Sqlite DB 我想通过 ADB shell 命令打开 查看或创建数据库 我在命令提示符中编写了以下命令 cd C android sdk r04 windows android sdk windows tools
  • Python If == true 语句仅适用于 readline 的最后一行

    我的函数仅表示单词文件中的最后一个单词是字谜 第一个辅助函数 但文件中的每个单词都是我测试的单词的字谜词 并通过主函数之外的辅助函数独立返回 true 我不确定这是否与 n是字符串的一部分 然后它解释了这一点 但我尝试放入一个 if 语句
  • 在 PHP/MySQL 中使用 Week(Date) 时,如何将一周的第一天设置为星期一?

    我正在使用以下代码构建 Google 图表 以提取 MySQL 表中与一年中的周数相对应的所有条目 目前 周数从星期日开始 我想更改此设置 以便它们从星期一开始 但我不确定如何执行此操作 i 1 while i lt 53 week sta
  • perl中与-e和正则表达式匹配的文件名

    我需要检查目录中是否存在文件 文件名的模式如下 d1 d2 d3 abcd 12345 67890 dat 在我的程序中 我将知道文件名abcd 我需要写一个if使用条件 e选项并查找与上面给定模式匹配的文件 您可以使用glob返回名称与模
  • xslt 是将文本转换为 xml 结构的好方法吗?

    我正在尝试找到一个更好的解决方案来将纯文本 但每个字段具有预定义的长度 转换为 xml 例如输入文本可以是 Testuser new york 10018 前 11 个字符表示用户名 接下来的 12 个字符表示城市 接下来的 5 个字符表示
  • 没有主键的实体的 Symfony Doctrine 模型

    我在重建 Web 应用程序时正在使用旧数据库 我想使用 Symfony2 x 它显然将 Doctrine 作为 ORM 我有大约 50 个 mysql 表 它们没有主键 当我尝试生成模型时 它不允许我这样做并抛出 表上没有主键 的异常 我是
  • 如何使用联系人框架获取 iOS 9 中的所有联系人记录

    AddressBook 框架的大部分内容在 iOS 9 中已被弃用 在新的 Contacts 框架中文档仅显示如何获取与a匹配的记录NSPredicate 但是如果我想要怎么办all记录 其他两个答案都只从容器中加载联系人defaultCo
  • TLS 不适用于 Kubernetes 中的负载均衡器后端服务

    我试图通过创建服务类型作为负载均衡器来公开集群中的应用程序 这样做的原因是我希望这个应用程序有一个单独的沟通渠道 我有一个 KOPS 集群 我想使用AWS的网络负载均衡器 以便它获得静态IP 当我创建服务并将端口 80 映射到应用程序运行的
  • laravel 5.5 由于不活动,页面已过期。请刷新并重试

    我是 Laravel 的新手 我有一个我不明白的问题 我的项目中有一个日志表单 我的方法是POST 当我尝试请求时 结果是 由于不活动 该页面已过期 请刷新并尝试 再次 但是如果我将方法更改为GET 效果很好 有人可以告诉我为什么会这样以及
  • 卸载从源代码构建的 python?

    我已经从源代码安装了 python 2 6 后来又错误地从包管理器安装了另一个 python 2 6 我找不到卸载从源代码构建的 python 的方法 这可能 容易吗 运行 ubuntu 10 04 您可以使用 checkinstall 来
  • WPF 工具包 DataGrid 复选框问题

    我真的希望有人能在这里帮助我 我的程序中有一个 DataGrid 它有一个复选框列 DataGrid 的 ItemsSource 是以编程方式加载的 DataSet 当我在 DataGrid 中选择几个项目然后滚动它时 我得到了一些非常奇怪
  • 在 HTML 代码中的何处插入 JavaScript 库和 CSS?

    我对 Web 开发不太陌生 当我在互联网上搜索其他主题时 我看到很多人将流行的 JS 库放在他们网站的不同地方 例如 在 上插入 JS 库非常开始或开始 部分 在加载任何 JS 代码或 CSS 文件之前 例如 在 上插入 JS 库结束了 部
  • 如何为spark-submit添加资源jar?

    我的spark应用程序依赖于adam 2 11 0 20 0 jar 每次我都必须将我的应用程序与adam 2 11 0 20 0 jar打包为fat jar以提交到spark 例如我的fat jar是myApp1 adam 2 11 0
  • 以编程方式运行 MSBuild

    我正在尝试以编程方式执行 MSBuild 但无法执行以下命令 string command string Format C Windows Microsoft NET Framework v4 0 30319 msbuild exe 0 1
  • 如何使用 Jersey 2 测试框架为此类编写单元测试

    我正在尝试为 Rest api 调用编写单元测试 该调用具有 POST 方法 用于使用 Jersey2 将视频文件添加到基于 Web 的应用程序 这是我的类方法的签名 TemplateController java 我想为其编写单元测试 P