Pouvez-vous me montrer un moyen de simuler l'accès simultané à memcache sur Google App Engine? J'essaye avec LocalServiceTestHelpers et les discussions mais n'ai pas de chance. Chaque fois que je tente d'accéder Memcache dans un fil, alors je reçois cette erreur:Google App Engine: test d'unité d'accès simultané à memcache
ApiProxy$CallNotFoundException: The API package 'memcache' or call 'Increment()' was not found
Je suppose que la bibliothèque de tests de GAE SDK a essayé d'imiter l'environnement réel et donc la configuration de l'environnement pour un seul fil (la thread qui exécute le test) qui ne peut pas être vu par un autre thread.
Voici un morceau de code qui peut reproduire le problème
package org.seamoo.cache.memcacheImpl;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.google.appengine.api.memcache.MemcacheService;
import com.google.appengine.api.memcache.MemcacheServiceFactory;
import com.google.appengine.tools.development.testing.LocalMemcacheServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
public class MemcacheTest {
LocalServiceTestHelper helper;
public MemcacheTest() {
LocalMemcacheServiceTestConfig memcacheConfig = new LocalMemcacheServiceTestConfig();
helper = new LocalServiceTestHelper(memcacheConfig);
}
/**
*
*/
@BeforeMethod
public void setUp() {
helper.setUp();
}
/**
* @see LocalServiceTest#tearDown()
*/
@AfterMethod
public void tearDown() {
helper.tearDown();
}
@Test
public void memcacheConcurrentAccess() throws InterruptedException {
final MemcacheService service = MemcacheServiceFactory.getMemcacheService();
Runnable runner = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
service.increment("test-key", 1L, 1L);
try {
Thread.sleep(200L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
service.increment("test-key", 1L, 1L);
}
};
Thread t1 = new Thread(runner);
Thread t2 = new Thread(runner);
t1.start();
t2.start();
while (t1.isAlive()) {
Thread.sleep(100L);
}
Assert.assertEquals((Long) (service.get("test-key")), new Long(4L));
}
}
Hmm, je pense que vous avez fait un bon point ici. Je n'ai pas vraiment besoin de tester l'accès concurrent car il devrait être garanti par Google. Ce que je dois tester, c'est si ma logique métier fonctionne bien avec un accès synchronisé. –