Java 正则表达式:匹配JUnit assertEquals?
我正在将许多测试从JUnit迁移到Spock:Java 正则表达式:匹配JUnit assertEquals?,java,regex,Java,Regex,我正在将许多测试从JUnit迁移到Spock: // before assertEquals("John Doe", userDTO.getFirstName()); // after userDTO.getFirstName() == "John Doe" 为了让事情变得更快,我想通过一个正则表达式(受监督的)逐文件替换(大多数)JUnit的断言表达式assertFalse、assertTrue和assertNotNull很容易,但是assertEqual不容易,因为它有两个参数 我当前的
// before
assertEquals("John Doe", userDTO.getFirstName());
// after
userDTO.getFirstName() == "John Doe"
为了让事情变得更快,我想通过一个正则表达式(受监督的)逐文件替换(大多数)JUnit的断言表达式assertFalse
、assertTrue
和assertNotNull
很容易,但是assertEqual
不容易,因为它有两个参数
我当前的尝试是:assertEquals\([^;]+),([^;]+)\代码>。但是,这并不能很好地工作,因为它不知道一个,
是否分隔了一个assertEquals参数如何解决此问题?
我的测试用例是:
assertEquals(az, bz);
assertEquals(az(), bz);
assertEquals(az, bz());
assertEquals(az(), bz));
assertEquals(az, bz(cz, dz));
assertEquals(bz(cz, dz), az);
PS:嵌套方法调用超出了此处的范围
联机:一般来说,将任意嵌套结构与正则表达式匹配不是您应该做的事情。但是,如果我们将您的需求限制在这里列出的测试用例中(删除第四个,这是一个错误),那么我们可以做一些事情。您还可以为各种附加的有限情况构造正则表达式,而不会使事情变得太困难
我将用python进行说明,但在IDE中可能也会用到同样的东西
>>> import re
>>> import pprint
>>> t = ["assertEquals(az, bz);", \
... "assertEquals(az(), bz);", \
... "assertEquals(az, bz());", \
... "assertEquals(az, bz(dz));", \
... "assertEquals(bz(dz), az);", \
... "assertEquals(az, bz(cz, dz));", \
... "assertEquals(bz(cz, dz), az);"]
>>> var = r'([a-z]+(\(([a-z]+(\s*,\s*[a-z]+)*)?\))?)'
>>> res = [ \
... re.sub( \
... r'assertEquals\(\s*' + var + '\s*,\s*' + var + '\s*\)', \
... r'\1 == \5', str \
... ) \
... for str in t]
>>> pprint.pprint(res)
['az == bz;',
'az() == bz;',
'az == bz();',
'az == bz(dz);',
'bz(dz) == az;',
'az == bz(cz, dz);',
'bz(cz, dz) == az;']
重要的部分是var
:
( # group the entire var before the comma
[a-z]+ # acceptable variable name
( # followed by an optional group
\( # containing a pair of matching parens
( # which contain, optionally
[a-z]+ # an acceptable variable name
( # followed by any number (0 or more)
\s*,\s*[a-z]+ # of commas followed by acceptable variable names
)*
)?
\)
)?
)
为了在实际代码中实现这一点,您必须将[a-z]
更改为更合理的值,例如[a-zA-Z0-9.
您是否应该比较userDTO.getFirstName().equals(“John Doe”)而不是userDTO.getFirstName()=“John Doe”@MitakshGupta Spock是一个基于groovy的测试DSL,字符串可以使用==