2010-06-15 15 views
19

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); 
    } 
} 

Respuesta

19

En Eclipse, ¿ha añadido todos los frascos mencionado here? Necesitas algunos jar más que appengine-testing.jar.

Sin embargo, si sus pruebas o código bajo prueba tienen estas dependencias se necesita un poco más de JAR en la ruta de clases de pruebas: $ {} SDK_ROOT /lib/impl/appengine-api.jar, $ {} SDK_ROOT /lib/impl/appengine-api-labs.jar, y $ {SDK_ROOT} /lib/impl/appengine-api-stubs.jar. Estos JAR hacen que las API de tiempo de ejecución y las implementaciones locales de esas API estén disponibles para sus pruebas.

+0

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ó. –

+2

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? –

+0

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. –

0

Peter's answer es correcta: se necesita estas bibliotecas:

appengine-api.jar 
appengine-api-labs.jar 
appengine-api-stubs.jar 
appengine-tools-api.jar 

más probable es que ya tiene la primera y sólo necesita los tres últimos.

Si está utilizando Maven, puede agregar estas dependencias a pom.xml:

<dependency> 
    <groupId>com.google.appengine</groupId> 
    <artifactId>appengine-api-labs</artifactId> 
    <version>1.9.60</version> 
    <scope>test</scope> 
</dependency> 

<dependency> 
    <groupId>com.google.appengine</groupId> 
    <artifactId>appengine-api-stubs</artifactId> 
    <version>1.9.60</version> 
    <scope>test</scope> 
</dependency> 

<dependency> 
    <groupId>com.google.appengine</groupId> 
    <artifactId>appengine-tools-sdk</artifactId> 
    <version>1.9.60</version> 
    <scope>test</scope> 
</dependency>