Forum Discussion

dgossner's avatar
dgossner
New Contributor
8 years ago

Groovy Datasource fails after several runs

I have a Groovy Datasource that combines the responses from several previous http requests into a single datasource.  It works great the first few times that the test is run but after a few times it starts failing and generates a NullPointerException.  If I restart SoapUI it starts working again for a few runs.

 

The error log:

Thu Sep 29 10:42:41 MDT 2016:ERROR:java.lang.NullPointerException
   java.lang.NullPointerException
   	at com.eviware.soapui.support.scripting.groovy.SoapUIGroovyScriptEngine.setVariable(SoapUIGroovyScriptEngine.java:146)
   	at com.eviware.soapui.impl.wsdl.teststeps.datasource.GroovyDataSource.next(GroovyDataSource.java:73)
   	at com.eviware.soapui.impl.wsdl.teststeps.WsdlDataSourceTestStep.c(WsdlDataSourceTestStep.java:586)
   	at com.eviware.soapui.impl.wsdl.teststeps.WsdlDataSourceTestStep.b(WsdlDataSourceTestStep.java:565)
   	at com.eviware.soapui.impl.wsdl.teststeps.WsdlDataSourceTestStep.a(WsdlDataSourceTestStep.java:752)
   	at com.eviware.soapui.impl.wsdl.teststeps.WsdlDataSourceTestStep.next(WsdlDataSourceTestStep.java:762)
   	at com.eviware.soapui.impl.wsdl.panels.teststeps.DataSourceDesktopPanel$TestAction.actionPerformed(DataSourceDesktopPanel.java:520)
   	at com.eviware.soapui.impl.wsdl.panels.teststeps.DataSourceDesktopPanel$TestAction.actionPerformed(DataSourceDesktopPanel.java:1)
   	at com.eviware.soapui.impl.wsdl.actions.iface.AbstractSwingAction.actionPerformed(AbstractSwingAction.java:62)
   	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
   	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
   	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
   	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
   	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
   	at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
   	at java.awt.Component.processMouseEvent(Unknown Source)
   	at javax.swing.JComponent.processMouseEvent(Unknown Source)
   	at java.awt.Component.processEvent(Unknown Source)
   	at java.awt.Container.processEvent(Unknown Source)
   	at java.awt.Component.dispatchEventImpl(Unknown Source)
   	at java.awt.Container.dispatchEventImpl(Unknown Source)
   	at java.awt.Component.dispatchEvent(Unknown Source)
   	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
   	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
   	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
   	at java.awt.Container.dispatchEventImpl(Unknown Source)
   	at java.awt.Window.dispatchEventImpl(Unknown Source)
   	at java.awt.Component.dispatchEvent(Unknown Source)
   	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
   	at java.awt.EventQueue.access$500(Unknown Source)
   	at java.awt.EventQueue$3.run(Unknown Source)
   	at java.awt.EventQueue$3.run(Unknown Source)
   	at java.security.AccessController.doPrivileged(Native Method)
   	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
   	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
   	at java.awt.EventQueue$4.run(Unknown Source)
   	at java.awt.EventQueue$4.run(Unknown Source)
   	at java.security.AccessController.doPrivileged(Native Method)
   	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
   	at java.awt.EventQueue.dispatchEvent(Unknown Source)
   	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
   	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
   	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
   	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   	at java.awt.EventDispatchThread.run(Unknown Source)

 

 

 

My Datasource code:

 

import groovy.json.JsonSlurper

def responseOne = context.expand( '${Request One#Response}' )
def responseOneJson = new JsonSlurper().parseText(responseOne)

def responseTwo = context.expand( '${Request Two#Response}' )
def responseTwoJson = new JsonSlurper().parseText(responseTwo)

def responseThree = context.expand( '${Request Three#Response}' )
def responseThreeJson = new JsonSlurper().parseText(responseThree)

//verify the slurper isn't empty
assert !(responseOneJson.isEmpty()) && !(responseTwoJson.isEmpty()) && !(responseThreeJson.isEmpty())

def row = testRunner.testCase.testSteps["Data Source"].currentRow
def numOfRows = 5

def responseOneSize = responseOneJson.value.size()
def responseTwoSize = responseTwoJson.value.size()
def responseThreeSize = responseThreeJson.value.size()

if((row + 1) <= numOfRows){
// output to the test step property in the result map
result["Id One"] = responseOneJson.value[row % responseOneSize].id
result["Id Two"] = responseTwoJson.value[row % responseTwoSize].id
result["Id Three"] = responseThreeJson.value[row % responseThreeSize].id
}

3 Replies