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