我还没有找到一种方法来转义 CSV 资源文件中由 ,
CsvFileSource
注释使用的 junit5
字符。因此,任何包含逗号的字符串都会被切成两半,并且第二部分永远不会被使用。
有什么解决方法吗?
编辑:原来的问题不完整。问题是我的资源中有逗号和双引号。参数化测试处理引号,但不处理两者。
CSV 行示例:
5,10,5,53,"</identity/partners?limit=5&cursor=5>; rel="prev", </identity/partners?limit=5&cursor=15>; rel="next""
引号被正确转义,但直到出现一个通配逗号(这是我可能猜测的算法)。
因此生成的断言如下所示:
"Link" was not "\"</identity/partners?limit=5&cursor=5>; rel=\"prev\"", was "</identity/partners?limit=5&cursor=5>; rel="prev", </identity/partners?limit=5&cursor=15>; rel="next""
如果有人进入此页面寻找答案,这是我在测试中使用的一个示例,以实现能够在我的测试中使用这些字符串值的目标(注意:它不会转义逗号,但实现了运行的目标输入中包含逗号的测试。您可以使用任何您想要的分隔符)。
@ParameterizedTest(name = "Product details for product number - {0}")
@CsvSource(value = {"0; Sauce Labs Backpack;carry.allTheThings() with the sleek, streamlined Sly Pack that melds uncompromising style with unequaled laptop and tablet protection."
,"1; Sauce Labs Bike Light;A red light isn't the desired state in testing but it sure helps when riding your bike at night. Water-resistant with 3 lighting modes, 1 AAA battery included."
}, delimiter = ';')
void assertThatProductDescriptionIsCorrectForAStandardUser(Integer productNumber, String productSummary, String productDescription) {
String url = String.format("%s/%s", swagItemDetails, productNumber);
deepLink.deepLinkToScreen(url , packageName);
assertAll("Product Details"
, () -> assertEquals(productSummary, productScreen.getProductSummary())
, () -> assertEquals(productDescription, productScreen.getProductDescriptionByText(productDescription))
);
}
将您的值用双引号括起来:
"first, value", second, third and last one
在您的情况下,您可以在注释中指定完全不同的 delimiter 字符: https://junit.org/junit5/docs/current/api/org.junit.jupiter.params/org/junit/jupiter/ params/provider/CsvFileSource.html#delimiter()
但是它不再是“逗号”分隔的值......
您应该使用引号字符用逗号引用值。默认情况下引号字符是单引号
'
,如下所示:
@CsvSource({
"apple,1",
"'lemon, lime',0xF1"})
如示例所示,“柠檬、酸橙”将被视为单一值。 要更改引号字符,请使用
quoteCharacter
参数:
@CsvSource({
"apple,1",
"\"lemon, lime\",0xF1"}, quoteCharacter = '\"')