Java 正则表达式:匹配JUnit assertEquals?

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不容易,因为它有两个参数 我当前的

我正在将许多测试从JUnit迁移到Spock:

// 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,字符串可以使用==