Search code examples
google-app-enginegoogle-cloud-datastoreobjectify

How to resolve "You have not started an Objectify context" in JUnit?


I've got some Objectify test code running in JUnit and I'm getting this error:

java.lang.IllegalStateException: You have not started an Objectify context. You are probably missing the ObjectifyFilter. If you are not running in the context of an http request, see the ObjectifyService.run() method.
    at com.googlecode.objectify.ObjectifyService.ofy(ObjectifyService.java:44)
    at com.googlecode.objectify.impl.ref.LiveRef.<init>(LiveRef.java:31)
    at com.googlecode.objectify.Ref.create(Ref.java:26)
    at com.googlecode.objectify.Ref.create(Ref.java:32)
    at com.netbase.followerdownloader.repository.DownloadTaskRepositoryImpl.create(DownloadTaskRepositoryImpl.java:35)
    at com.netbase.followerdownloader.repository.DownloadTaskRepositoryImplTest.setUp(DownloadTaskRepositoryImplTest.java:45)

How do I resolve this for test code?


Solution

  • Jeff Schnitzer answered this here: https://groups.google.com/forum/#!topic/objectify-appengine/8HinahG7irg. That link points to https://groups.google.com/forum/#!topic/objectify-appengine/O4FHC_i7EGk where Jeff suggests the following quick and dirty workaround:

    • My @BeforeMethod starts an objectify context (ObjectifyService.begin())

    • My @AfterMethod closes the objectify context

    Jeff suggests we use ObjectifyService.run() instead but admits it's more work.

    Here's how my implementation looks:

    public class DownloadTaskRepositoryImplTest {
        // maximum eventual consistency (see https://cloud.google.com/appengine/docs/java/tools/localunittesting)
        private final LocalServiceTestHelper helper =
            new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig()
                .setDefaultHighRepJobPolicyUnappliedJobPercentage(100));
    
        private Closeable closeable;
    
        @Before
        public void setUp() {
            helper.setUp();
            ObjectifyRegistrar.registerDataModel();
            closeable = ObjectifyService.begin();
        }
    
        @After
        public void tearDown() {
            closeable.close();
    
            helper.tearDown();
        }