【问题标题】:JUnit testing Spymemcached clientJUnit 测试 Spymemcached 客户端
【发布时间】:2014-06-10 19:54:31
【问题描述】:

我有一个包含 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 在这里更好,那也很好)但到目前为止,我无法弄清楚在这种情况下编写测试的通常首选方式是什么。

也可以举个例子。

非常感谢,

【问题讨论】:

    标签: java unit-testing junit mocking spymemcached


    【解决方案1】:

    我认为问题在于你问自己一个错误的问题。你想测试什么?这些是从最不可能到最有可能排序的。

    • 您是否正在尝试测试SpyMemcached 库是否正常工作?
      • 如果这是真的,您不应该测试您的包装器。
    • 您是否正在尝试测试您的类调用SpyMemcachedClientWrapper 的正确方法?
      • 如果是这样,您应该测试其他类,并提供 SpyMemcachedClientWrapper 的模拟。
    • 您是否尝试测试SpyMemcachedClientWrapper 在各种场景中调用MemcachedClient 的正确方法?

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

    您实际上并不需要 SpyMemcached 来测试此行为。

    该行为与SpyMemcached无关!您所需要的只是界面。但是,因为您在构造函数中调用了new,所以您实际上无法获取此代码来提供例如MemcachedClient 的模拟。 This article is an absolute, must read for you.

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

    1. 不推荐 Use PowerMock to override the behavior of the new operator。这样,您可以用模拟替换 MemcachedClient 对象的创建,并在其上调用 verify 方法。
    2. 首选重构您的构造函数以使用dependency injection,然后简单地将模拟传递给构造函数中的包装器。这将允许您酌情致电verify

    【讨论】:

      【解决方案2】:

      如果我理解正确,您不想检查包装器是否调用了正确的方法,而是想知道 spymemcached 库在调用真正的 memcached 时是否按预期工作。

      如果是这种情况,您不想编写单元测试,而是要编写集成测试,因为单元测试的定义是没有任何外部资源的测试。

      如果从运行测试的服务器无法访问真正的 memcache 服务器,为什么不启动测试 memcache 并配置测试运行,即带有要连接的主机的属性文件。

      正如前一个答案中的 durron 所说,它显然有助于重构硬编码的构造函数以接受一个 spymemcached 实例,然后您可以进一步影响它,即用于单元测试/模拟。

      附带说明:一个快速而肮脏的解决方案是用对 System.getProperty 的调用替换硬编码的连接字符串,然后在开始测试运行时使用 -D... 设置变量,但正如我所说,这又快又脏 ;-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多