Google Datastore Emulator using Java (Not using GAE)

后端 未结 2 530
死守一世寂寞
死守一世寂寞 2021-01-18 06:35

I am using Google Cloud\'s Datastore Client Library for Java to access the Cloud Datastore.

Note: I am not using App Engine to deploy my applicatio

2条回答
  •  一整个雨季
    2021-01-18 06:54

    I assume that you want to test against the Datastore Emulator. In that case it is not necessary to start the Datastore Emulator from the shell. There is a LocalDatastoreHelper in the gcloud library that allows you to create, start, reset and stop a local Datastore Emulator with ease.

    I didn't found any documentation on that, so I created this testcases for you:

    import com.google.cloud.datastore.Datastore;
    import com.google.cloud.datastore.DatastoreOptions;
    import com.google.cloud.datastore.Entity;
    import com.google.cloud.datastore.KeyFactory;
    import com.google.cloud.datastore.testing.LocalDatastoreHelper;
    import org.junit.*;
    
    import java.io.IOException;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertNull;
    
    /**
     * This testcase demonstrate the use of the datastore emulator in JUnit test cases.
     *
     * from @link https://www.kontaktlinsen-preisvergleich.de
     */
    public class DatastoreEmulatorTest {
    
        protected static LocalDatastoreHelper localDatastoreHelper;
    
        protected Datastore datastore;
    
        protected KeyFactory keyFactory;
    
        @BeforeClass
        public static void setUpClass() throws InterruptedException, IOException {
            // create and start a local datastore emulator on a random free port
            // this also means that you probably can run tests like this concurrently.
            System.out.println("[Datastore-Emulator] start");
            localDatastoreHelper = LocalDatastoreHelper.create();
            localDatastoreHelper.start();
            System.out.println("[Datastore-Emulator] listening on port: " + localDatastoreHelper.getPort());
    
            // set the system property to tell the gcloud lib to use the datastore emulator
            System.setProperty("DATASTORE_EMULATOR_HOST","localhost:" + localDatastoreHelper.getPort());
        }
    
        @Before
        public void setUp() {
            // create the datastore instance
            // because of the system property set it in setUpClass() this
            // datastore will be connected with the datastore emulator.
            datastore = DatastoreOptions.getDefaultInstance().getService();
            keyFactory = datastore.newKeyFactory().setKind("TestEntity");
        }
    
        @After
        public void tearDown() throws IOException {
            System.out.println("[Datastore-Emulator] reset");
            // this resets the datastore after every test
            localDatastoreHelper.reset();
        }
    
        @AfterClass
        public static void tearDownClass() throws InterruptedException, IOException {
            System.out.println("[Datastore-Emulator] stop");
            // this stops the datastore emulator after all tests are done
            localDatastoreHelper.stop();
        }
    
        @Test
        public void test1() {
            // stores an entity in the datastore and retrieves it later
    
            // create an Entity "TestEntity"
            Entity.Builder builder = Entity.newBuilder(keyFactory.newKey(42));
            builder.set("name", "Test1");
    
            // store it in datastore
            datastore.put(builder.build());
    
            // retrieve entity by key
            Entity entity = datastore.get(keyFactory.newKey(42));
            assertNotNull(entity);
            assertEquals("Test1", entity.getString("name"));
        }
    
        @Test
        public void test2() {
            // try to access the entity created in test1, shouldn't work because
            // of calling reset in tearDown() after each test.
    
            // try to retrieve entity by key
            Entity entity = datastore.get(keyFactory.newKey(42));
            assertNull(entity);
        }
    }
    

    The LocalDatastoreHelper creates a Datastore Emulator instance on a free port and doesn't store to disk - when you stop the testcase with the debugger and look for processes, you'll find something like this:

    $ ps ax | grep CloudDatastore
    2614   ??  R      0:01.39 /usr/bin/java -cp /Users/marco/google-cloud-sdk/platform/cloud-datastore-emulator/CloudDatastore.jar com.google.cloud.datastore.emulator.CloudDatastore /Users/marco/google-cloud-sdk/platform/cloud-datastore-emulator/cloud_datastore_emulator start --host=localhost --port=57640 --store_on_disk=False --consistency=0.9 --allow_remote_shutdown /var/folders/ky/c126qk_161159ltyrbpdxv8w0000gn/T/gcd2141205756617995044
    

    That also means you should also be able to run tests in parallel, too.

提交回复
热议问题