我有以下单元测试使用net.spy.memcached.MemcachedClient
@Test
public void testCASFailsWrite() throws Exception {
Integer begin = new Integer(3);
client.set(key, 0, begin);
CASValue<Object> casValue = client.gets(key);
Assert.assertNotNull(casValue);
Assert.assertTrue(casValue.getValue() instanceof Integer);
Integer fromCache = (Integer) casValue.getValue();
Integer nextSeq = new Integer(fromCache + 9);
long myInvalidValue = casValue.getCas() - 1;
CASResponse response = client.cas(key, myInvalidValue, nextSeq);
Assert.assertEquals(CASResponse.EXISTS, response);
}
我希望CASResponse显示已经存在的值,因为我有一个无效的casValue,但是在最后一个Assert中它返回OK。我想确保我的密钥句柄在多个JVM上同时更新。我的单元测试是通过com.thimbleware.jmemcached.AbstractCache的实现使用嵌入式memcache进程。当我的密钥已经在memcache中并且我没有相同的casValue()时,我可以依赖CASResponse来显示EXISTS吗?
答案 0 :(得分:0)
这可能是因为您正在对一个全新的memcached实例运行此测试。 cas值在memcached实例中是全局的,第一个集合接收cas值1,第二个集合获得cas值2,依此类推。运行测试时,密钥的cas值为1.由于只是递减此密钥的cas值而生成无效的cas,因此无效的cas值最终为0.在更新中指定cas值为0表示忽略cas,只是更新。将myInvalidValue设置为一些随机数,如123456,这个问题就会消失。另一个有趣的事情是,如果你在两次以上的地方运行你的测试,它将会第二次通过。