App Engine stories are easy

Posted by: Andrew Glover on 2010-10-22 12:07:00.0

GAEWith the release of easyb 0.9.8, a new plugin has hit the streets that enables easyb to more easily verify Google App Engine applications running locally. That is, the easyb-gae plugin makes available all the local testing services provided by Google inside easyb stories; thus, verifying GAE applications just got a lot more fun, baby!

The easyb-gae plugin makes a number of services implicitly available in the binding of a story, for example, an instance of Google’s DatastoreService is available, thus making it possible to work with persist-able objects. For instance, with the easyb-gae plugin, you can now easily verify the proper behavior of say, Objectify-Appengine or Twig entities.

By specifying in my story that I wish to use the GAE plugin by the using phrase in easyb, I can then assume that an underlying services layer has been fired up, thus mimicking the App Engine in the real. This means, if I’m using Objectify for example, I can manipulate my domain objects as they would normally function live.

For example, the story below verifies the proper behavior of two domain objects managed by Objectify: Retweet and User. In this case, an instance of User holds a collection of Retweets — given that a User instance has more than one, I can ask a User instance for its most influential retweeter (that is, who has the most followers who has retweeted the current user).

import com.b50.gretweet.Retweet
import com.b50.gretweet.User
import com.googlecode.objectify.ObjectifyService

using "GAE"
extension "behaviorCategory" //enables shoulds in when phrases

scenario "user objects should return a list of retweets by influence", {

 given "all domain objects have been registered", {
  ObjectifyService.register(Retweet.class);
  ObjectifyService.register(User.class);
 }

 when "a new user instance is created", {
  new User("aglover", "token", "secret").save()
 }	

 and "when a few retweets have been added", {
  user =  User.findByName("aglover")
  user.shouldNotBe null

  (0..4).each{
   user.addRetweet(new Retweet("bobama_${it}", (1 + it),
     new Date(), "blah blah blah ${it}", (300 + it)))
   }
   user.save()
  }

 then "a user most influential retweet should be first ", {
   retweets = user.listAllRetweetsByInfluence()
   retweets[0].influence.shouldBe 304
  }
}

Note that by specifying Using "GAE" at the top of this story, I’ve implicitly made the local services of App Engine available — thus, when I issue a save on my domain objects (which intern uses Objectify to persist the underlying object) they are persisted into the local datastore that mimics Bigtable (as exposed via GAE). That’s why I can then find my User instance (by the way, this User type is distinctly different than the one provided by default in GAE).

As you can see, the easyb-gae plugin makes working with GAE, well, easy! For more information, see the easyb-gae plugin page on the easyb wiki. Or just download it today and see for yourself!

Looking to spin up Continuous Integration quickly? Check out www.ciinabox.com.


be the first to rate this blog

About Andrew Glover

Andrew Glover

Andrew is the founder of the easyb BDD framework and the co-author of Addison Wesley's "Continuous Integration", Manning's "Groovy in Action" and "Java Testing Patterns". He is an author for multiple online publications including IBM's developerWorks and Oreilly's ONJava and ONLamp portals. He actively blogs about software at thediscoblog.com.

More About Andrew »

NFJS, the Magazine

2010-10-01 00:00:00.0 Issue Now Available
  • What's Brewing in Java 7: The Language Features
    by Venkat Subramaniam
  • Waste!
    by Hamlet D`Arcy
  • Arquillian: A component Model for Integration Testing
    by Dan Allen
  • Spring Roo - A Jump-Start for Your Java Project
    by Paul Chapman
Learn More »