Tengo problemas para configurar JUnit con App Engine en Eclipse. Tengo JUnit configurado correctamente, es decir, puedo ejecutar pruebas que no involucran el almacén de datos u otros servicios. Sin embargo, cuando intento usar el almacén de datos en mis pruebas, fallan. El código que estoy tratando en este momento es del sitio de App Engine (véase más adelante):Uso de JUnit con App Engine y Eclipse
http://code.google.com/appengine/docs/java/tools/localunittesting.html#Running_Tests
Hasta aquí he añadido el JAR externo (usando Eclipse) appengine-testing.jar. Pero cuando realizo las pruebas obtengo la excepción a continuación. Por lo tanto, claramente no entiendo las instrucciones para habilitar los servicios desde la página web mencionada anteriormente. ¿Puede alguien aclarar los pasos necesarios para que los servicios de App Engine estén disponibles en Eclipse?
java.lang.NoClassDefFoundError: com/google/appengine/api/datastore/dev/LocalDatastoreService
at com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig.tearDown(LocalDatastoreServiceTestConfig.java:138)
at com.google.appengine.tools.development.testing.LocalServiceTestHelper.tearDown(LocalServiceTestHelper.java:254)
at com.cooperconrad.server.MemberTest.tearDown(MemberTest.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:37)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.ClassNotFoundException: com.google.appengine.api.datastore.dev.LocalDatastoreService
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 25 more
Aquí está el código real (más o menos copiado de la página):
package com.example;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
public class MemberTest
{
private final LocalServiceTestHelper helper = new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());
@Before
public void setUp() {
helper.setUp();
}
@After
public void tearDown() {
helper.tearDown();
}
// run this test twice to prove we're not leaking any state across tests
private void doTest() {
DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
assertEquals(0, ds.prepare(new Query("yam")).countEntities());
ds.put(new Entity("yam"));
ds.put(new Entity("yam"));
assertEquals(2, ds.prepare(new Query("yam")).countEntities());
}
@Test
public void testInsert1() {
doTest();
}
@Test
public void testInsert2() {
doTest();
}
@Test
public void foo()
{
assertEquals(4, 2 + 2);
}
}
Gracias Pedro, que hizo el truco. La documentación lo hizo sonar como una situación cualquiera (al menos para mí) pero una vez que agregué los tres frascos mencionados anteriormente, todo funcionó. –
Mark y Peter, ¿cómo se ve tu archivo .classpath? El mío tiene líneas como " ", pero esto no funciona. ¿El código es "$ {SDK_ROOT}", o debo completar el camino? –
Esto resolvió mi problema, pero tuve que averiguar dónde encontrar los 4 archivos jar a los que se hace referencia en la solución de Peter Recore. En Eclipse (Juno) fui a Project => Properties => Java Build Path => Libraries => Add External JARs. Luego (en mi Mac) navegué a Aplicaciones \ eclipse \ plugins \ com.google.appengine.eclipse.sdkbundle_1.9.9 \ appengine-java-sdk-1.9.9 \ impl y seleccioné los 3 archivos JAR. Luego volví a subir un directorio y bajé al directorio de pruebas para obtener el 4º JAR, concretamente appengine-testing.jar. –