【问题标题】:Groovy : Is it possible to make a dynamic property with this?Groovy:是否可以用它来制作动态属性?
【发布时间】:2014-08-20 15:32:19
【问题描述】:

是否可以在一行动态属性中转换以下 groovy 请求? 该问题是针对在 SOAPui 请求中使用结果而不使用 groovy 脚本。 因为我有很多不同的日期要输入我的请求,还有我的断言。

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 月……等等。

【问题讨论】:

    标签: groovy soapui


    【解决方案1】:

    详情请见优秀post

    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 脚本......我不想
    【解决方案2】:

    我不知道 Soap UI,但mixing the Category into the respective types 有帮助吗?

    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>
    

    【讨论】:

    • 嗨,我在原始问题中添加了更多详细信息。也许我描述了一个糟糕的问题......
    • 它不适用于 Soapui xml 请求。我不知道是否可以插入“groovy.time.TimeCategory”。但如果它有效,另一个问题是日期不会随时间变化,因为日期写在变量上......我需要一个变量来获取今天的日期(正负 x 个月),因为我会在一年内通过几次这个测试。而且我不希望这被引用到日期。如果不清楚,请告诉我。
    • 您能否使用元编程向 Date 对象添加一个方法,该方法抽象该逻辑并在 soapui 上调用它?
    【解决方案3】:

    我找到了这个,例如“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 中使用相同的方法,所以我可以为它们做同样的事情。

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

    【讨论】:

      猜你喜欢
      • 2012-03-04
      • 2020-01-18
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多