My tech blog

Mixing instances in a Cucumber World

leave a comment »

I recently had the problem of calling a step from another step definition in cucumber using groovy (cuke4duke). Example:

Given (~/I look for "(.*)" in "(.*)"/) { what, where ->
      // groovy code


to be called from another step:

When (~/I perform more than (.*) searches per minute/) { int number ->
        (1..number).each {
                Given('I look for "John Smith " in "London"')


It’s possible to do this using Ruby (the cucumber native language), Java or Scala; but apparently it is not currently possible on groovy.

After posting my question on Cukes Groups I came up with this solution:


Given (~/I look for "(.*)" in "(.*)"/) { what, where ->
	lookFor(what, where)


When (~/I perform more than (.*) searches per minute/) { int number ->
	(1..number).each {
		lookFor("John Smith","London")


import geb.Browser
import org.openqa.selenium.firefox.FirefoxDriver


class Searcher {
	def lookFor(what, where) {
		$('form')[0].looking_for = what
		$('form')[0].location = where
		$('input', value: "Search")[0].click()

World() {
  def world = new Browser("http://localhost:8080/myApp")  // mixing an instance of Browser
  world.metaClass.mixin Searcher
  return world

After() {

Notice that I am not mixing an Object as Richard Paul suggested. In my case, I need to get an specific instance of Browser to be used across steps.

Anyway, I am posting this solution for people who might need something like this. In my case, I found out that my problem is in the way the step definitions are organized. Most of the times this kind of problem is caused by wrong organization of concepts so I recommend you think twice or even three times if you are placing your step in the right place before using a solution like the one I suggested here.

Hope this helps!


Written by alexcuesta

April 15, 2011 at 11:19 am

Posted in Testing

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )


Connecting to %s

%d bloggers like this: