我有一个类,它围绕着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在这里更好,也可以),但到目前为止,我还没有弄清楚在这个场景中编写测试的通常首选方法是什么。
举一个例子也会更好。
非常感谢,
发布于 2014-06-10 20:20:25
我想问题是你问错了自己。你想测试什么?这些都是从最少到最有可能的顺序。
SpyMemcached
库是否正常工作?SpyMemcachedClientWrapper
方法?SpyMemcachedClientWrapper
的模拟。SpyMemcachedClientWrapper
调用MemcachedClient
的正确方法?首先,您难以测试的原因是在包装器的构造函数中调用new
。这就是依赖注入发挥作用的地方。换言之,从这个答案中得出的主要结论是:
您实际上不需要SpyMemcached
来测试这种行为。
这种行为与SpyMemcached
无关!你所需要的只是接口。但是,因为在构造函数中调用了new
,所以实际上无法获得这段代码来提供(比方说) MemcachedClient
的模拟。这篇文章是绝对的,一定要给你看。
不过,我将简要总结这篇文章的结论,以及它们如何适用于您的情况。你可以:
发布于 2014-06-10 21:06:14
如果我对您的理解是正确的,那么您不希望检查包装器是否调用了正确的方法,您希望知道在调用真正的memcached时,spymemcached库是否像预期的那样工作。
如果是这样的话,您不想编写单元测试,而是想编写集成测试,因为从定义上来说,单元测试是一个没有任何外部资源的测试。
如果无法从测试运行的服务器访问真正的memcache服务器,那么为什么不启动一个测试memcache并配置测试运行,即使用一个带有要连接的主机的属性文件。
正如durron在前面的回答中所说的,它显然有助于重构硬编码的构造函数,以接受一个间谍存储实例,然后您可以进一步影响它,即用于单元测试/模拟。
顺便提一句:一个快速而肮脏的解决方案是用调用System.getProperty替换硬编码的连接字符串,然后用-D设置变量.当开始测试时,就像我说过的,这是快速而肮脏的;-)
https://stackoverflow.com/questions/24149755
复制相似问题