1

I am using gMock for groovy to create unit tests. I have a base class which contains an ArrayList of "Players" I have another class that works as my GUI interface. A method in that user interface will take the list of Players and display the players names in a combobox. The method looks like this:

def displayGuild(){
   guildList = new JList(g.guild.collect(){ obj  -> obj.getName()})
}

The problem I'm having is trying to set the expectation and return values for this method what I have is something like this:

    ...
    def playerList = getGuildList()
    mockGame.setGuildList(playerList).returns(playerList)
    mockGame.guild.returns(mockList).times(2)
    mockList.isEmpty().returns(false)
    mockList.collect().returns(playerList.collect(){obj  -> obj.getName()})
    festSetUp(panel.gPane.mainM)
    play{
        panel.g.setGuildList(playerList)
        robot.keyPress(VK_A)
        robot.keyRelease(VK_A)
        assertThat (panel.gPane.addCharacter.isVisible(), is(true))
    }

When I run the test I get a decent sized stacktrace but I'm not sure how to address it because it looks like the problem is with the closure.

My abbreviated stacktrace is this:

Exception in thread "AWT-EventQueue-0" junit.framework.AssertionFailedError: Unexpected method call 'collect(buchwalter.oldschoolgame.panels.MainMenuPanel$_displayGuild_closure2@4f2f2008)' on 'Mock for ArrayList'
  'setGuildList([buchwalter.oldschoolgame.characters.Fighter@501b7924, buchwalter.oldschoolgame.characters.Barbarian@3bae5392])' on 'Mock for Game': expected 1, actual 1
  'guild' on 'Mock for Game': expected 2, actual 2
'isEmpty()' on 'Mock for ArrayList': expected 1, actual 1
  'collect()' on 'Mock for ArrayList': expected 1, actual 0
at junit.framework.Assert.fail(Assert.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite$StaticMetaMethodSiteNoUnwrap.invoke(StaticMetaMethodSite.java:130)
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.call(StaticMetaMethodSite.java:88)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at org.gmock.internal.InternalMockController.fail(InternalMockController.groovy:171)
at org.gmock.internal.InternalMockController$fail.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120)
at org.gmock.internal.metaclass.MetaClassHelper.findExpectation(MetaClassHelper.groovy:25)
at org.gmock.internal.metaclass.MetaClassHelper$findExpectation.callStatic(Unknown Source)
at org.gmock.internal.MockInternal.invokeMockMethod(MockInternal.groovy:84)
at org.gmock.internal.metaclass.MockProxyMetaClass$2.call(MockProxyMetaClass.java:51)
at org.gmock.internal.Callable$call.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.gmock.internal.Callable$call.call(Unknown Source)
at org.gmock.internal.InternalMockController.doWork(InternalMockController.groovy:204)
at org.gmock.internal.InternalMockController.this$2$doWork(InternalMockController.groovy)
at org.gmock.internal.InternalMockController$this$2$doWork.callCurrent(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
at org.gmock.internal.InternalMockController$this$2$doWork.callCurrent(Unknown Source)
at org.gmock.internal.InternalMockController.doInternal(InternalMockController.groovy:193)
at org.gmock.internal.InternalMockController$doInternal.callCurrent(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
at org.gmock.internal.InternalMockController$doInternal.callCurrent(Unknown Source)
at org.gmock.internal.InternalMockController.doInternal(InternalMockController.groovy:186)
at org.gmock.internal.metaclass.MockProxyMetaClass.invokeMethod(MockProxyMetaClass.java:45)
at org.gmock.internal.metaclass.MockProxyMetaClass.invokeMethod(MockProxyMetaClass.java:40)
at org.gmock.internal.metaclass.GeneratedMockProxyMetaClass.invokeMethod(GeneratedMockProxyMetaClass.java:37)

Any Help would be appreciated

TroyB
  • 195
  • 1
  • 14

1 Answers1

0

You should be able to quickly fix your test by using a simple customized matcher, that matches any closure passed to the collect method, by tweaking one line this way:

mockList.collect(match { return true }).returns(playerList.collect(){obj  -> obj.toString()})
papacito
  • 369
  • 7
  • 18