简体   繁体   中英

Gosu system table query failing in Gunits

I have a Guidewire Gunit for a transformer in gosu which queries the system table to get a description for a result code which is working fine when run on the server but Gunit fails for the same. I have tried the annotation @ServerTest for Gunit but that is failing as well. The same code works fine in Gosu scratchpad. PFA the code snippet as follows:

var resultCodes = Query.make(SystemTable).select().where(\elt -> elt.ResultCode == "AS01")

var description = ""

if(resultCodes != null && !resultCodes.isEmpty())
{
  description = resultCodes.get(0).getFullDescription()
}

I'm getting the exception as follows :

java.lang.IllegalStateException: TableMetadataFactory cannot be used before it is started

Thanks, Deepti

  1. (Suggestion : )If your requirement is just to query based on some values. Better dont use that .where() condition.

    This is like SELECT * FROM <TABLE> and after getting all the data you are picking out your required result.

The best and the actual way is to use like

Query.make(TABLE_NAME).compare(TABLE_NAME#FIELD_NAME,Relop.Equals,"value_to_compare").select();

Query will be like

SELECT * FROM <TABLE_NAME>  WHERE FIELD_NAME = FIELD_VALUE_TO_COMPARE;
  1. While running Gunits, GW uses Shadow tables which will be basically empty. Here if you are using OOTB entities, You can use Builder classes or if you need to use some custom entities, use bundles to insert data first.

After inserting data into SystemTable (either using builder classes or bundles) run the below code.

var resultCodes = Query.make(SystemTable).compare(SystemTable#ResultCode ,Relop.Equals,"AS01").select()
foreach(result in resultCodes){
  description = result.FullDescription
  print("Output : "+description);
}

This happens when your RunLevel is set too low. Run levels below "NO_DAEMONS" will not load system tables. The default should be "NO_DAEMONS" so if you have an annotation on your test like this:

@RunLevel(gw.api.system.server.Runlevel.NONE)

either remove it or increase the level.

You can refactor your code like this:

uses gw.testharness.RunLevel
uses gw.api.database.Query
uses org.mockito.Mockito
uses gw.api.database.IQueryBeanResult

@RunLevel(NONE)
class StackOverflowTest {

  function testDoQuery() {
    var rs = Mockito.mock(IQueryBeanResult<SystemTable>)
    var query = Mockito.mock(Query<SystemTable>)
    Mockito.when(query.select()).thenReturn(rs)
    var stackOverflow = Mockito.spy(new StackOverflow())
    Mockito.doReturn(query).when(stackOverflow).getSystemTableQuery()

    stackOverflow.doQuery()
    Mockito.verify(stackOverflow, Mockito.times(1)).getSystemTableQuery()
    Mockito.verify(query, Mockito.times(1)).select()
    Mockito.verify(rs, Mockito.times(1)).iterator()
  }

  class StackOverflow {

    function doQuery() {
      var resultCodes = getSystemTableQuery().select().where(\elt -> elt.ResultCode == "AS01")
    }

    protected function getSystemTableQuery(): Query<SystemTable> {
      return Query.make(SystemTable)
    }
  }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM