如何在 Java Spring 中模拟 RestTemplate?

2024-05-16

public class ServiceTest {
    @Mock
    RestTemplate restTemplate = new RestTemplate();
    @InjectMocks
    Service service = new Service();
    ResponseEntity responseEntity = mock(ResponseEntity.class);

    @Test
    public void test() throws Exception {
        Mockito.when(restTemplate.getForEntity(
                Mockito.anyString(),
                Matchers.any(Class.class)
                ))
                .thenReturn(responseEntity);
        boolean res = service.isEnabled("something");
        Assert.assertEquals(res, false);
    }

我尝试对包含休息客户端的服务进行简单的测试。看来我还没有嘲笑RestTemplate成功地。看起来代码获取的是真实数据而不是模拟数据。任何人都可以帮助我解决这个问题。

该服务本身将如下所示:

public class Service{
    public boolean isEnabled(String xxx) {
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response = restTemplate.getForEntity("someurl",String.class);
        if(...)return true;
        return false;
    }
}

问题是在你的isEnabled您正在创建一个新的 RestTemplate。这是错误的,原因有两个,一是你不能模拟它,因为你正在创建一个新对象,二是最好避免每个请求创建新对象。 RestTemplate 是线程安全的,因此可以作为服务类成员,在多个线程中使用。

将您的服务类别更改为如下所示:

public class Service{

    RestTemplate restTemplate = new RestTemplate();

    public boolean isEnabled(String xxx) {
        ResponseEntity<String> response = restTemplate.getForEntity("someurl",String.class);
        if(...)return true;
        return false;
    }
}

现在您的 RestTemplate 已成为类成员,您现在可以通过两种方式之一正确模拟。一、使用注入@InjectMock,或者使用您从测试中调用的 setter 方法。

由于您在代码中使用 InjectMock,我们可以这样做。

@RunWith(MockitoJUnitRunner.class) 
public class ServiceTest {
    @Mock
    RestTemplate restTemplate;
    @InjectMocks
    @Spy
    Service service;
    ResponseEntity responseEntity = mock(ResponseEntity.class);

    @Test
    public void test() throws Exception {
        Mockito.when(restTemplate.getForEntity(
                Mockito.anyString(),
                ArgumentMatchers.any(Class.class)
                ))
                .thenReturn(responseEntity);
        boolean res = service.isEnabled("something");
        Assert.assertEquals(res, false);
    }

请注意,我做了一些更改。首先,我删除了new RestTemplate() and new Service()。你应该让mockito为你创建这些。通过注释它们@Mock and @Spy您将确保 Mockito 将为您创建它们,更重要的是,会将模拟注入到您的service object.

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

如何在 Java Spring 中模拟 RestTemplate? 的相关文章

随机推荐

  • 将图例标签设置为块

    我已经在以下网址设置了我的问题的演示 http jsfiddle net YHHg7 4 http jsfiddle net YHHg7 4 我正在尝试执行以下操作 legend display block border bottom 1p
  • 创建django权限,报错:ContentType匹配查询不存在

    我正在尝试添加两个组并授予他们对我的 Django 项目的权限 但我不断收到错误 ContentType 匹配查询不存在 我在跑步 姜戈 1 5 4 Python 2 7 3 南0 8 2 后SQL 9 3 这是我的代码 import dj
  • 在 mongodb 和 nodejs 中对博客和评级进行建模

    我有一个博客集合 其中包含用户给予的标题 正文和综合评分 另一个集合 评级 其架构引用了博客 以对象 ID 的形式对博客进行评级 如果有的话 的用户以及他们给出的评级 即 1 或 1 当特定用户按照 最新优先 的顺序浏览博客时 比如每页 4
  • Java 动画中的跳跃和撕裂

    以下代码绘制一个正方形 其中两个较小的正方形在其中旋转 每当你点击键盘上的箭头时 整个系统就会朝那个方向移动 然而 我遇到了一些图像撕裂和有时跳过的问题 它很小但仍然存在 我想知道是否有人知道如何在不大规模更改代码的情况下解决这些问题 im
  • 使用 CounterClockwise 和 Eclipse 在 Clojure REPL 中进行评估

    我通常使用 Emacs 但受到启发再次尝试 CCW Eclipse 我有一个 Clojure 测试项目 其源文件 src user clj 包含以下内容 ns user println hi 我有一个 REPL 我从 Window gt S
  • 如何让 LinqToXSD 正确输出命名空间前缀声明?

    我正在尝试创建 XML 数据绑定类LinqToXSD http linqtoxsd codeplex com 以及包含许多导入模式的 XML 模式 所有的模式都是位于这里 http www spiraltechinc com Tmats 为
  • fwrite 将错误指示器放在 C 中的流上

    在什么情况下 函数 fwrite 会将错误指示符放入流中 以便 Ferror 将返回 true 具体来说 我想知道当所有字节未成功写入时它是否会出错 请提供一个链接 说明您从哪里获取信息 谢谢 如果发生任何错误 流的错误指示器将被设置 并且
  • 我可以使用 HTTP 范围标头“有意”加载部分文件吗?

    我正在研究 HTTP 范围标头 specs http www w3 org Protocols rfc2616 rfc2616 sec14 html sec14 16 据我了解 我可以设置文件的字节范围ala 0 199 2000 200
  • 使用 Java 文件中的代码编译 Java 文件

    我目前正在创建一个个人 也许是公共 java 终端 我想创建一个在执行时创建 编译 Java 文件的命令 但我不太确定如何实际执行此操作 是否可以 或者我只是在做梦 你也可以使用Groovy http groovy codehaus org
  • Backbone Marionette CompositeView 排序列表 - 在添加时呈现额外的模型

    这是小提琴 http jsfiddle net QhQ8D 10 http jsfiddle net QhQ8D 10 代码在下面 制作一个聊天应用程序 需要一个排序的 连接的用户列表 名称上带有比较器的图形集合连接到 CompositeV
  • C++:获取器和设置器?

    我正在尝试编写一些代码来为以下数据的 ID 号 名字 姓氏 期中成绩和期末成绩创建 getter 和 setter 这些数据位于我正在编写的班级的文本文件中 10601 ANDRES HYUN 88 91 94 94 89 84 94 84
  • Android STFP 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在我的 Android 项目中使用 SFTP 安卓已经有了吗 SFTP 库 还是我必须实现它 I
  • Postgresql 串行错误自动增量

    我在 postgresql 上遇到问题 我认为 postgresql 中有一个错误 我错误地实现了一些东西 有一个表包括colmn1 primary key colmn2 unique colmn3 插入一行后 如果我尝试使用现有的另一次插
  • 具有不同数量查询参数的两种 GET 方法:REST

    我有一个 Rest 端点类 如下所示 Path sports public interface SportsEndpoint GET List
  • 无法将 minicom 的输出保存到文件中

    当我使用Minicom从串口捕获数据时 我需要将大数据保存到一个文件中 名为minicom cap 但是 如果我按 Ctrl A 和 L 来捕获文件 则失败 没有创建文件 minicom cap之前并不存在 我的下载目录已正确创建 我的操作
  • PyLaTeX: pylatex.errors.CompilerError: 未找到 LaTex 编译器

    我正在尝试运行确切的代码here https jeltef github io PyLaTeX current examples basic html the code获取 pylatex 工作的示例 在我正在工作的目录中 我已从链接复制并
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • 无法解析 ^ 字符

    好的 现在我可以解析空间 这是我之前的问题 现在我的解析器几乎准备好了 但有一个我无法找出的缺陷 我能够检索段后的数据 参见代码 和管道之间的数据 我无法达到的是升级并检索包含在管道之间并由 分隔的数据 Eg Input String is
  • 通过 XML 将重复事件添加到 Google 日历

    我正在尝试通过协议 API 将重复事件添加到我的日历中 我从在 Google 界面中创建的事件中获取了重复标记的语法 并将其用于我的创建请求中 这是我提交的内容
  • 如何在 Java Spring 中模拟 RestTemplate?

    public class ServiceTest Mock RestTemplate restTemplate new RestTemplate InjectMocks Service service new Service Respons