JUnit 测试 Spymemcached 客户端

2024-04-28

我有一个类围绕spymemcached 客户端,我想编写一些JUnit 测试来测试getValue 和addKey 方法是否有效。

问题是无法从测试服务器访问spymemcached 服务器,所以我想这里需要一些模拟。

我的简化类看起来像这样:

public class SpyMemcachedClientWrapper {

    private MemcachedClient spyMemcachedClient;

    public SpyMemcachedClientWrapper()
        spyMemcachedClient = new MemcachedClient(new ConnectionFactoryBuilder().build(),
                        AddrUtil.getAddresses("192.168.1.122:11211"));
    }

    public Object getValue(Object key) {
        Object obj = null;
        Future<Object> f = null;

        f = spyMemcachedClient.asyncGet(key);

        try {
            obj = f.get(2000, TimeUnit.MILLISECONDS);
        } catch (TimeoutException ex) {
            f.cancel(false);
        }

        return obj;
    }

    public boolean addKey(Object key, Object value) {
        OperationFuture<Boolean> t = spyMemcachedClient.set(key, 0, value);
        return t.getStatus().isSuccess();
    }
}

您能否给我一些提示或最佳实践建议,如何为此类编写 SpyMemcachedClientWrapperTest?我想我可以使用 Mockito 或 EasyMock (Mockito 更好,但如果 EasyMock 在这里更好,那也很好),但到目前为止我无法弄清楚在这种情况下编写测试的通常首选方式是什么。

一个例子也将受到赞赏。

非常感谢,


我认为问题在于你问了自己错误的问题。你想测试什么?这些按照可能性从最小到最大的顺序排列。

  • Are you trying to test that the SpyMemcached library works properly?
    • 如果这是真的,那么您就不应该测试您的包装器。
  • Are you trying to test that your classes call the proper methods of SpyMemcachedClientWrapper?
    • 如果这是真的,您应该测试其他类,并提供一个模拟SpyMemcachedClientWrapper.
  • 你想测试一下吗SpyMemcachedClientWrapper调用正确的方法MemcachedClient在各种场景下?

首先,您努力测试这一点的原因是您正在调用new在包装器的构造函数内。这就是依赖注入发挥作用的地方。换句话说,从这个答案中得出的主要结论是:

你实际上并不需要SpyMemcached来测试这个行为。

该行为与以下内容无关SpyMemcached!您所需要的只是界面。然而,因为你打电话new在构造函数中,您实际上无法获取此代码来提供,例如,模拟MemcachedClient. 这篇文章是绝对的,你必须阅读。 http://misko.hevery.com/2008/07/08/how-to-think-about-the-new-operator/

不过,我将简要总结该文章的结论,以及它们如何应用于您的情况。您可以:

  1. 不优选 使用 PowerMock 覆盖的行为new操作员 https://code.google.com/p/powermock/wiki/MockConstructor。这样你就可以替换创建MemcachedClient具有模拟和调用的对象verify其上的方法。
  2. 首选重构您的构造函数以使用依赖注入 https://en.wikipedia.org/wiki/Dependency_injection,然后简单地将模拟传递给构造函数中的包装器。这将允许您致电verify作为适当的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JUnit 测试 Spymemcached 客户端 的相关文章

随机推荐

  • OCaml:如何运行包含库的脚本

    我正在按照 Real World OCaml 一书来学习 OCaml 许多程序都需要使用 Jane Street Core 库 当我在顶层使用这个核心库中的函数时 它工作得很好 在那里 我只需使用以下命令来打开 Core 库 use top
  • YouTube iframe 不响应 postMessage 命令

    我正在尝试使用来自父级的 postMessage 命令来控制 YouTube iframe 但它似乎不起作用 由于多种原因 我没有使用 YouTube API 只是使用带有 YouTube 嵌入视频的普通 iframe 我尝试发送命令的方式
  • monodevelop 2.1+ 支持 Visual Studio 2010 项目文件吗?

    monodevelop 2 1 是否支持 Visual Studio 2010 项目文件 但是 如果不支持 有人知道计划何时提供支持吗 我问的原因是我有一个在 VS2008 和 Monodevelop 中都使用的解决方案 当我在 2010
  • 为什么 reposync 没有签出我在清单文件中指定的分支?

    假设我有以下清单文件repo https source android com setup develop repo tool MCVE https stackoverflow com help minimal reproducible e
  • 如何通过父进程杀死子进程?

    我使用创建一个子进程fork 如果子进程无法在30秒内完成执行 父进程如何杀死子进程 我想让子进程最多执行 30 秒 如果超过30秒 父进程就会杀死它 你有想法这样做吗 向其发送 SIGTERM 或 SIGKILL http en wiki
  • Dropzone.js 和每个文件的完整路径

    我正在尝试使用 Dropzone js 重新创建删除的文件 文件夹的文件夹结构 有没有办法访问每个文件的完整路径 以便可以在 php 端重新创建目录结构 这是一种简单的方法 您可以额外发送某些文件夹中所有文件的完整路径 dropzone o
  • Xgboost:bst.best_score、bst.best_iteration 和 bst.best_ntree_limit 有什么区别?

    当我使用 xgboost 训练我的数据时2 cates classification problem 我想使用提前停止来获得最佳模型 但我对在预测中使用哪一个模型感到困惑 因为提前停止将返回 3 个不同的选择 例如 我应该使用 preds
  • 读写文本文件的最佳方法

    我正在使用最新版本的 Lazarus IDE 并且我有一个Memo1在我的 TForm1 上 我必须加载一个文本文件Memo1然后编辑备忘录的每一行 我使用Memo1 Lines Strings i 最后 我必须将编辑后的备忘录保存在特定路
  • 对浮点数求反总是安全的吗

    考虑 double f foo double g f where foo 可以返回分配给的任何内容f is double g f 在 C 和 C 中安全吗 对于 IEEE 754 类型 显然是这样 但 C 和 C 并不限制浮点实现 与 Ja
  • 数组向量无法编译[重复]

    这个问题在这里已经有答案了 这个简单的程序 include
  • TreeSet 给出不正确的输出 - Java8

    在处理树集时 我发现了非常奇怪的行为 根据我的理解 以下程序应该打印两行相同的行 public class TestSet static void test String args Set
  • 如何调试 iOS 应用程序在启动时崩溃,仅在程序集文件中设置断点

    我遇到了当前正在开发的应用程序的问题 问题是应用程序在启动时在后台运行一段时间后崩溃 并且仅在这种情况下 在应用程序被杀死时启动应用程序不会导致调试器或手机崩溃 无论是否进行调试 在后台启动应用程序大约 5 10 分钟都不会导致崩溃 在后台
  • 以编程方式设置 Swift 元素的位置

    我在故事板中定义了一个标签 我正在尝试以编程方式更改其位置 SO 上已有一些问题似乎可以解决此问题 但似乎没有一个解决方案有效 即标签不移动 我已经删除了标签上所有现有的限制 但无济于事 我试过了 class LandingViewCont
  • 使用 Prism 在 Xamarin Forms 的后台服务中实现依赖注入

    我在我的 xamarin 表单项目中使用 Prism 我能够在我的视图模型中使用依赖注入 构造函数注入 没有任何问题 我还利用后台服务在后台推送长时间运行的任务 如何做我在后台服务中注入依赖项 当我尝试将接口对象作为参数传递给构造函数 Sy
  • CSV 实际上是....分号分隔值...(在 AZERTY 上导出 Excel)

    我在这里有点困惑 当我使用 Excel 2003 将工作表导出为 CSV 时 它实际上使用分号 Col1 Col2 Col3 shfdh dfhdsfhd fdhsdfh dgsgsd hdfhd hdsfhdfsh 现在 当我使用 Mic
  • 比 O(n) 更好的范围交集算法?

    范围交集是一个简单但不平凡的问题 已经回答过两次了 查找数字范围交集 https stackoverflow com questions 224878 find number range intersection 比较日期范围 https
  • 如何正确离开临界区?

    我有以下 C 代码 我在其中使用临界区对象 https msdn microsoft com en us library windows desktop ms682530 v vs 85 aspx EnterCriticalSection
  • mapFragment.getMapAsync 处的 NullPointerException

    在解决了与我的标题相关的问题后 我找不到问题的解决方案 我有一个NullPointerException at mapFragment getMapAsync 下面是我的MapActivity code package com exampl
  • 如何覆盖magento中的管理模板文件?

    我需要覆盖 adminhtml sales order create items grid phtml 文件 以在从管理员创建新订单时在每个项目下显示一些自定义文本 我希望通过自定义模块来完成此操作 任何人都可以建议如何覆盖管理模板文件 非
  • JUnit 测试 Spymemcached 客户端

    我有一个类围绕spymemcached 客户端 我想编写一些JUnit 测试来测试getValue 和addKey 方法是否有效 问题是无法从测试服务器访问spymemcached 服务器 所以我想这里需要一些模拟 我的简化类看起来像这样