【问题标题】:Spock Framework: How to create a customized Data ProviderSpock 框架:如何创建自定义的数据提供者
【发布时间】:2016-05-29 08:42:11
【问题描述】:

我正在与:

  • Spring MVC
  • Spring MVC 测试
  • Spock 框架

关于 Spock 与 @Unroll 合作我有以下关于 where 块的情况

我可以拥有以下:

where: "Internal"

    uriRequestReport << [ControllerSupportTest.createUrl1(), ControllerSupportTest.createUrl2()]
    methodNameReport << [ControllerSupportTest.METHODNAME_FINDONE_BYID, ControllerSupportTest.METHODNAME_FINDONE_BYID ]

这里烦人的部分是数据必须与项目或结构的数量相似,在本例中为 2。

我的意思是,以下失败:

where: "Internal"

    uriRequestReport << [ControllerSupportTest.createUrl1(), ControllerSupportTest.createUrl2()]
    methodNameReport << [ControllerSupportTest.METHODNAME_FINDONE_BYID]

你现在怎么看methodNameReport有一个项目。

Spock 抛出异常。

由于我可以测试许多 URL,因此重复 ControllerSupportTest.METHODNAME_FINDONE_BYID 术语的次数与我使用 ControllerSupportTest.createUrl#() 的次数一样多,其中 # 将是 5,例如

在某种程度上我可以通过以下方式处理:

注意:它是一个Java

public class MyDataSetUtil {

    private static final Integer COUNTER = 2;

    private MyDataSetUtil(){

    }

    public static List<String> uris(){
        String[] uris = new String[COUNTER];
        uris[0] = ControllerSupportTest.createUrl1()
        uris[1] = ControllerSupportTest.createUrl2()
    }

    public static String[] methodNames(){
        String[] methodNames = (String[])  
        createArray(ControllerSupportTest.METHODNAME_FINDONE_BYID);
        return methodNames;
    }

    private static String[] createArray(String value){
        String[] objects = new String[COUNTER];
        for(int i=0; i<COUNTER; i++){
            objects[i] = value;
        }
        return objects;
    }

}

直到这里我有两种问题

  1. 我必须始终控制计数器
  2. 如果我为where 块添加一个新变量,例如mediaType,那么我必须创建一个新方法,例如methodNames()
  3. 总是我必须为数组中的每个项目重复相同的数据,例如ControllerSupportTest.METHODNAME_FINDONE_BYID

对于前面两点,体现如下:

例如:

public static String[] mediaTypes(){
        String[] mediaTypes = (String[]) createArray(MediaType.APPLICATION_XML_VALUE);      
        return mediaTypes;
    }

我需要更实用的东西

我也读过 SO 的以下帖子

但对于我的情况,我不想使用 CSV

其他方法是通过 SQL,例如:

但同样,对于我的情况,我还不想使用 SQL

对我来说这种方法更有趣:

在那篇文章中他有:

where:
  [_, name, gender, expected] << new MultilineProvider(source: userData)

查看帖子中的MultilineProvider 代码。

因此我想做以下事情:

[uriRequestReport, methodNameReport, moreVariablesifExists] << [MyDataSetUtil.theMethod()]

要求

我想通过MyDataSetUtil.theMethod()(见上面显示的行)返回一个集合,其中每个项目代表相同的比

    uriRequestReport << [ControllerSupportTest.createUrl1(), ControllerSupportTest.createUrl2()]
    methodNameReport << [ControllerSupportTest.METHODNAME_FINDONE_BYID, ControllerSupportTest.METHODNAME_FINDONE_BYID ]

为了方便我在where块中添加一个新变量,快速更新Java类,避免多次重复相同的数据。

最好的方法是什么?请记住,代码应该基于 Java。

我在没有解决方案的情况下对 Google 进行了研究。

如果你有更好的建议,欢迎提出

【问题讨论】:

  • 令人惊讶的是,这个问题没有标记到java
  • 我的错误...已修复...

标签: java spock spring-test spring-test-mvc spock-reports


【解决方案1】:

只需编写将返回一组条目的方法(),其中每个条目都有一次测试运行所需的所有数据。 url 的 ArrayList、methodnames 的 ArrayList 和其他数据的 ArrayList。然后将所有列表放在一个大的 ArrayList 或 map 中并返回此对象。

{
 "urls":[list of urls]
 "methods":[list of methodNames]
 "otherdata":[listOfOtherData]
}

直接返回地图,或将此类地图制作成数组列表。

【讨论】:

    【解决方案2】:

    你可以试试这个:

    where: "Internal"
    
    uriRequestReport << [ControllerSupportTest.createUrl1(), ControllerSupportTest.createUrl2()]
    methodNameReport = [ControllerSupportTest.METHODNAME_FINDONE_BYID]
    

    【讨论】:

      猜你喜欢
      • 2013-11-09
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      相关资源
      最近更新 更多