Spock框架:如何创建自定义数据提供者

时间:2016-02-17 14:59:15

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

我正在使用:

  • Spring MVC
  • Spring MVC Test
  • Spock Framework

关于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抛出异常。

由于我可以测试多个网址,因此我会使用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
  4. 对于前两点,它反映如下:

    例如:

    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进行了研究。

    如果您有更好的建议,欢迎

2 个答案:

答案 0 :(得分:0)

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

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

直接返回地图,或制作此类地图的arraylist。

答案 1 :(得分:0)

您可以尝试以下方法:

where: "Internal"

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