首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JUnit测试Spymemcached客户端

JUnit测试Spymemcached客户端
EN

Stack Overflow用户
提问于 2014-06-10 19:54:31
回答 2查看 2.8K关注 0票数 2

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

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

我的简化课程如下所示:

代码语言:javascript
运行
复制
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在这里更好,也可以),但到目前为止,我还没有弄清楚在这个场景中编写测试的通常首选方法是什么。

举一个例子也会更好。

非常感谢,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-10 20:20:25

我想问题是你问错了自己。你想测试什么?这些都是从最少到最有可能的顺序。

  • 您是否试图测试SpyMemcached库是否正常工作?
    • 如果是这样的话,你不应该测试你的包装器。

  • 您是否试图测试类是否调用了适当的SpyMemcachedClientWrapper方法?
    • 如果是这样的话,您应该测试其他类,并提供SpyMemcachedClientWrapper的模拟。

  • 您是否试图在各种情况下测试SpyMemcachedClientWrapper调用MemcachedClient的正确方法?

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

您实际上不需要SpyMemcached来测试这种行为。

这种行为与SpyMemcached无关!你所需要的只是接口。但是,因为在构造函数中调用了new,所以实际上无法获得这段代码来提供(比方说) MemcachedClient的模拟。这篇文章是绝对的,一定要给你看。

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

  1. 不喜欢 运算符。通过这种方式,您可以用模拟替换MemcachedClient对象的创建,并在其上调用verify方法。
  2. 倾向于使用重构构造函数来使用依赖注入,然后简单地将模拟传递给构造函数中的包装器。这将允许您适当地调用verify
票数 2
EN

Stack Overflow用户

发布于 2014-06-10 21:06:14

如果我对您的理解是正确的,那么您不希望检查包装器是否调用了正确的方法,您希望知道在调用真正的memcached时,spymemcached库是否像预期的那样工作。

如果是这样的话,您不想编写单元测试,而是想编写集成测试,因为从定义上来说,单元测试是一个没有任何外部资源的测试。

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

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

顺便提一句:一个快速而肮脏的解决方案是用调用System.getProperty替换硬编码的连接字符串,然后用-D设置变量.当开始测试时,就像我说过的,这是快速而肮脏的;-)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24149755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档