1

我有一个用于 gosu 中的变压器的 Guidewire Gunit,它查询系统表以获取结果代码的描述,该代码在服务器上运行时工作正常,但 Gunit 失败。我已经为 Gunit 尝试了注释 @ServerTest,但这也失败了。相同的代码在 Gosu 暂存器中运行良好。PFA的代码片段如下:

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

变量描述 = ""

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

我得到如下异常:

java.lang.IllegalStateException: TableMetadataFactory 在启动之前不能使用

谢谢,迪普蒂

4

3 回答 3

1

当您的 RunLevel 设置得太低时,就会发生这种情况。低于“NO_DAEMONS”的运行级别将不会加载系统表。默认值应该是“NO_DAEMONS”,所以如果你的测试中有这样的注释:

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

要么删除它,要么提高水平。

于 2018-03-21T13:59:58.167 回答
1
  1. (建议:)如果您的要求只是基于某些值进行查询。最好不要使用那个.where()条件。

    这就像 SELECT * FROM <TABLE>在获得所有数据之后,您正在挑选所需的结果。

最好和实际的方法是使用 like

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

查询会像

SELECT * FROM <TABLE_NAME>  WHERE FIELD_NAME = FIELD_VALUE_TO_COMPARE;
  1. 在运行 Gunits 时,GW 使用基本上是空的影子表。在这里,如果您使用的是 OOTB 实体,您可以使用 Builder 类,或者如果您需要使用一些自定义实体,请先使用捆绑包插入数据。

将数据插入 SystemTable(使用构建器类或捆绑包)后,运行以下代码。

var resultCodes = Query.make(SystemTable).compare(SystemTable#ResultCode ,Relop.Equals,"AS01").select()
foreach(result in resultCodes){
  description = result.FullDescription
  print("Output : "+description);
}
于 2018-01-23T07:55:08.300 回答
1

你可以像这样重构你的代码:

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)
    }
  }

}
于 2018-08-28T11:32:07.690 回答