Domanda

Nella mia domanda ho una serie di di DAO che ho iniettare nel mio livello di applicazione. Per un test di accettazione che sto scrivendo, voglio precaricare la datastore dev_server con i dati, per cui uso la stessa configurazione di primavera del mio test JUnit (usando l'annotazione @ContextConfiguration) per iniettare un'istanza del DAO rilevante nel mio test. Quando sono in realtà vado a memorizzare alcuni dati per esempio:

dao.add(entity)

ottengo il temuto "No ambiente API è registrato per questa discussione."

Caused by: java.lang.NullPointerException: No API environment is registered for this thread.
 at com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppId(DatastoreApiHelper.java:108)
 at com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppIdNamespace(DatastoreApiHelper.java:118)
    ....

Questo è probabilmente perché il mio banco di prova non ha letto nella domanda-web.xml GAE con i dettagli app (anche se sto cercando di indovinare qui potrei davvero essere sbagliato); in modo che non sa di scrivere allo stesso archivio dati che l'applicazione in esecuzione sul dev_server è la lettura / scrittura su.

Come posso ottenere il mio test al "point" per lo stesso datastore come l'applicazione? C'è qualche meccanismo di "origine dati" che posso iniettare sia in app e il test? C'è un modo per ottenere la mia prova a forzare l'API datastore per leggere la configurazione necessaria?

È stato utile?

Soluzione 2

Ho trovato la soluzione !!!!

Per qualche motivo il Namespace, AppID ei campi AuthDomain del test datastore devono corrispondere a quello del dev_server, poi il dev_server possono vedere le entità inseriti dal test.

È possibile visualizzare i valori per l'ambiente (dev_server o codice di prova) con le seguenti affermazioni

System.out.println(NamespaceManager.get());
System.out.println(ApiProxy.getCurrentEnvironment().getAppId());
System.out.println(ApiProxy.getCurrentEnvironment().getAuthDomain());

l'istanza di LocalServiceTestHelper (ad es: gaeHelper), è possibile impostare i valori per l'ambiente di test

// the NamespaceManager is thread local.
NamespaceManager.set(NamespaceManager.getGoogleAppsNamespace());
gaeHelper.setEnvAppId(<the name of your app in appengine-web.xml>);
gaeHelper.setEnvAuthDomain("gmail.com");

Poi il dev_server vedrà le vostre entità. Tuttavia a causa di problemi di sincronizzazione, se il test scrive al datastore dopo il dev_server è stato avviato il dev_server abituato vederlo a meno che non può essere costretto a rileggere il file (che non ho ancora capito). Altrimenti il ??server deve essere riavviato.

Altri suggerimenti

Qui è una pagina che parla di come fare unit test che si connettono a un archivio dati dev. È questo il genere di cose che stai cercando? Fondamentalmente si parla di due classi, LocalServiceTestHelper e LocalDatastoreServiceTestConfig che è possibile utilizzare per impostare un ambiente per il test. Mentre l'esempio è per unit test, credo che funzionerà anche per la situazione.

È possibile allora le cose configura come se il datastore dev viene scritto su disco o semplicemente conservati in memoria (per le prove veloci). Se si desidera che questi dati per andare nello stesso posto come server dev, probabilmente si vuole regolare questo, come credo che il valore predefinito è l'opzione "in memoria". Se si guarda al javadoc c'è un metodo "setBackingStoreLocation" dove si può puntare a qualsiasi file che si desidera.

Ho trovato una soluzione, anche se non è molto bello perché ogni metodo di prova non ripulire il Datastore, come spiegato nell'articolo Unità locale test per Java , tuttavia, il datastore inizia pulita ogni volta che la classe test viene eseguito, quindi non è così male, a condizione che si sta attenti a che.

Il problema è, che quando si utilizza SpringJUnit4ClassRunner, l'ambiente molla è creato prima l'annotazione @Before può essere eseguito, la soluzione è l'uso @BeforeClass e utilizzare una variabile statica per LocalServiceTestHelper, di averli creati prima che l'ambiente primavera è impostato.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:META-INF/spring/context-test.xml")
@Transactional
public class MyTest {


    @Inject
    private MyService myService;

    private static final LocalServiceTestHelper helper = 
        new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());

    @BeforeClass
    public static void beforeClass() {
        helper.setUp();
    }

    @AfterClass
    public static void afterClass() {
        helper.tearDown();
    }

Se qualcuno ha una soluzione migliore, sarò contento di sentire!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top