Groovy:是否可以使用它创建动态属性?

3
能否将以下Groovy请求转换为一行动态属性? 这个问题是为了在不使用Groovy脚本的情况下在SOAPui请求中使用结果。 因为我有很多不同的日期要放在我的请求中,还有在我的断言中也需要用到。
import groovy.time.TimeCategory
use (TimeCategory) {
    date = new java.text.SimpleDateFormat("yyyy-MM-dd").format(new Date() -5.month)
}

我希望有一个动态属性,可以自由更改。例如:
<ech:date1>${Today - 5 month}</ech:date1>
<ech:date2>${Today - 4 month}</ech:date2>
<ech:date3>${Today - 3 week}</ech:date3>

编辑: 更多信息

实际上,我有一个动态属性,可以给我今天的日期,再加上或减去x天,我可以把它放在SOAPui的xml请求中:

[这里,它会返回今天的日期再加上二十天]

${=new java.text.SimpleDateFormat("yyyy-MM-dd").format(new Date()+20)}

示例应用程序:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ech="http://echange.service.open.bodet.com">
   <soapenv:Header/>
   <soapenv:Body>
      <ech:importRequests01>
         <ech:Requests01ToImport>
            <!--Zero or more repetitions:-->
            <ech:Request01>

               <ech:requestDate>${=new java.text.SimpleDateFormat("yyyy-MM-dd").format(new Date() +20)}</ech:requestDate>

               <!--You may enter ANY elements at this point-->
            </ech:Request01>
         </ech:Requests01ToImport>
      </ech:importRequests01>
   </soapenv:Body>
</soapenv:Envelope>

所以,我希望有一个类似的东西,但是可以查询今天日期加减x个月等。

3个回答

1
请参阅优秀的文章以获取详细信息:

import static java.util.Calendar.*

Date now = new Date()
now.clearTime()

Date nowMin5Month = now.updated( MONTH:now[ MONTH ] - 5 )
String nowMin3Week = now.updated( WEEK_OF_YEAR:now[ WEEK_OF_YEAR ] - 3 ).format( 'yyyy-MM-dd' )

谢谢您的回复,但我不能将此放在测试请求中!如果我采用您的解决方案,就像我的一样,我必须通过一个Groovy脚本...而我不想这样做。 - Vetea

1
我不熟悉Soap UI,但是 将类别混合到相应类型中 是否有帮助?
import groovy.time.TimeCategory

class TimeCategoryMixer {
    static global() {
        TimeCategory.metaClass.methods
            .findAll { it.isStatic() && !it.name.startsWith("__") && it.name != "global" }
            .each { it.nativeParameterTypes[0].mixin TimeCategory }
    }
}

TimeCategoryMixer.global()

def d = Date.parse('yyyy-MM-dd', '2000-01-01')

assert d - 5.month == Date.parse('yyyy-MM-dd', '1999-08-01')

更新

根据您的更新,这个怎么样:

b="${use(groovy.time.TimeCategory) { Date.parse('yyyy-MM-dd', '2000-01-01') - 5.month} }"

assert b == Date.parse('yyyy-MM-dd', '1999-08-01').toString()

我认为SoapUI会对这样的东西感到满意:

<ech:requestDate>${=use(groovy.time.TimeCategory) { Date.parse('yyyy-MM-dd', '2000-01-01') - 5.month}}</ech:requestDate>

嗨,我在我的原始问题中添加了更多细节。也许我描述了一个糟糕的问题... - Vetea
它不在Soapui xml请求上运作。我不知道是否可以插入“groovy.time.TimeCategory”。但如果它能运作,另一个问题是日期不会随时间变化,因为日期写在变量上......我需要一个变量来取今天的日期(增加或减少x个月),因为我将在一年内多次通过这些测试。而且我不希望这与日期相关联。如果不清楚,请告诉我。 - Vetea
你可以使用元编程将一个方法添加到日期对象中,抽象化这种逻辑,并在 SoapUI 上调用它吗? - Will

0

我发现这个例子可以给我一个"2014-7-10":

在Groovy中可用:

(Calendar.getInstance().get(Calendar.YEAR) - 0) +"-"+(Calendar.getInstance().get(Calendar.MONTH) +1)+"-"+(Calendar.getInstance().get(Calendar.DATE) - 0)

可从XML和SoapUI测试请求中使用:

${= (Calendar.getInstance().get(Calendar.YEAR) - 0) +"-"+(Calendar.getInstance().get(Calendar.MONTH) +1)+"-"+(Calendar.getInstance().get(Calendar.DATE) - 0)}

通过这个,我可以指定“MONTH -5”或“MONTH +2”。 因为我对YEAR或DAY使用相同的方法,所以我也可以对它们执行相同的操作。

警告:不要忘记在公历中,第一个月即1月等于0。 这就是为什么我加上了“...get(Calendar.MONTH) +1...”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接