Resolvido - JUnit + Google Appengine

Bom dia pessoal.

Venho desenvolvendo um sistema com o Google Appengine, e estou começando a estudar TDD e tentando implantar os testes em meu sistema. O problema é que o Appengine tem algumas particularidades relacionadas aos serviços que disponibiliza, principalmente a persistência de dados, e para se realizar testes unitários do armazenamento existem alguns procedimentos a se executar, descritos em http://code.google.com/intl/pt-BR/appengine/docs/java/howto/unittesting.html.

Seguindo o passo-a-passo, escrevi minha classe de teste, como segue:

package br.com.perludum.controleveiculos.dao;

import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.users.User;

import br.com.perludum.controleveiculos.LocalDatastoreTestCase;
import br.com.perludum.controleveiculos.entidades.Usuario;

public class UsuarioDAOTeste extends LocalDatastoreTestCase {
	UsuarioDAO usuarioDAO = new UsuarioDAO();
		
	public void testAdiciona() throws Exception {
		User user = new User("email@teste.com", "teste.com");
		
		Usuario usuario = new Usuario();
		usuario.setContaGoogle(user);
		usuario.setNome("Tiago");
		usuario.setSobrenome("Santos");
		usuarioDAO.adiciona(usuario);
		try {
			Query query = new Query( Usuario.class.getSimpleName() );
			
			assertEquals(2, DatastoreServiceFactory
					.getDatastoreService()
					.prepare( query )
					.countEntities());

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

Ao executar recebo o seguinte erro:

java.lang.NullPointerException
	at com.google.appengine.api.NamespaceManager.get(NamespaceManager.java:98)
	at com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppIdNamespace(DatastoreApiHelper.java:85)
	at com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppIdNamespace(DatastoreApiHelper.java:77)
	at com.google.appengine.api.datastore.Query.<init>(Query.java:70)
	at br.com.perludum.controleveiculos.dao.UsuarioDAOTeste.testAdiciona(UsuarioDAOTeste.java:33)
	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 junit.framework.TestCase.runTest(TestCase.java:154)
	at junit.framework.TestCase.runBare(TestCase.java:127)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:118)
	at junit.framework.TestSuite.runTest(TestSuite.java:208)
	at junit.framework.TestSuite.run(TestSuite.java:203)
	at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
	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)

Já pesquisei muito na net, já fiz vários testes e nada de conseguir resolver isso. Alguém aqui sabe me dizer o que pode estar acontecendo? E alguém aqui sabe de algum artigo mais detalhado de como se fazer testes com o armazenamento de dados do Appengine?

Bom, a solução era só questão de eu ter prestado mais atenção… :frowning:

O problema é que o link que eu passei em português está desatualizado. As instruções corretas estão em http://code.google.com/intl/en/appengine/docs/java/howto/unittesting.html, ou seja, a versão em inglês do documentos. O problema está nessa linha do documento em português:

LocalDatastoreService datastoreService = 
          (LocalDatastoreService) proxy.getService("datastore_v3");

sendo que o correto é:

LocalDatastoreService datastoreService = 
            (LocalDatastoreService) proxy.getService(LocalDatastoreService.PACKAGE);