Best way to automagically migrate tests from JUnit 3 to JUnit 4?

前端 未结 7 1791
天命终不由人
天命终不由人 2020-11-29 20:14

I have a bunch of JUnit 3 classes which extend TestCase and would like to automatically migrate them to be JUnit4 tests with annotations such as @Before,

7条回答
  •  失恋的感觉
    2020-11-29 21:00

    Here are the actual regular expressions I used to execute furtelwart's suggestions:

    // Add @Test
    Replace:
    ^[ \t]+(public +void +test)
    With:
        @Test\n    $1
    Regular Expression: on
    Case sensitive: on
    File name filter:
    *Test.java
    
    // Remove double @Test's on already @Test annotated files
    Replace:
    ^[ \t]+@Test\n[ \t]+@Test
    With:
        @Test
    Regular Expression: on
    Case sensitive: on
    File name filter:
    *Test.java
    
    
    // Remove all empty setUp's
    Replace:
    ^[ \*]+((public|protected) +)?void +setUp\(\)[^\{]*\{\s*(super\.setUp\(\);)?\s*\}\n([ \t]*\n)?
    With nothing
    Regular Expression: on
    Case sensitive: on
    File name filter:
    *Test.java
    
    // Add @Before to all setUp's
    Replace:
    ^([ \t]+@Override\n)?[ \t]+((public|protected) +)?(void +setUp\(\))
    With:
        @Before\n    public void setUp()
    Regular Expression: on
    Case sensitive: on
    File name filter:
    *Test.java
    
    // Remove double @Before's on already @Before annotated files
    Replace:
    ^[ \t]+@Before\n[ \t]+@Before
    With:
        @Before
    Regular Expression: on
    Case sensitive: on
    File name filter:
    *Test.java
    
    
    // Remove all empty tearDown's
    Replace:
    ^[ \*]+((public|protected) +)?void +tearDown\(\)[^\{]*\{\s*(super\.tearDown\(\);)?\s*\}\n([ \t]*\n)?
    With nothing
    Regular Expression: on
    Case sensitive: on
    File name filter:
    *Test.java
    
    // Add @After to all tearDown's
    Replace:
    ^([ \t]+@Override\n)?[ \t]+((public|protected) +)?(void +tearDown\(\))
    With:
        @After\n    public void tearDown()
    Regular Expression: on
    Case sensitive: on
    File name filter:
    *Test.java
    
    // Remove double @After's on already @After annotated files
    Replace:
    ^[ \t]+@After\n[ \t]+@After
    With:
        @After
    Regular Expression: on
    Case sensitive: on
    File name filter:
    *Test.java
    
    
    // Remove old imports, add new imports
    Replace:
    ^([ \t]*import[ \t]+junit\.framework\.Assert;\n)?[ \t]*import[ \t]+junit\.framework\.TestCase;
    With:
    import org.junit.After;\nimport org.junit.Before;\nimport org.junit.Test;\nimport static org.junit.Assert.*;
    Regular Expression: on
    Case sensitive: on
    File name filter:
    *Test.java
    
    
    // Remove all extends TestCase
    Replace:
    [ \t]+extends[ \t]+TestCase[ \t]+\{
    With:
     {
    Regular Expression: on
    Case sensitive: on
    File name filter:
    *Test.java
    
    
    
    // Look for import junit.framework;
    Find:
    import junit\.framework
    Manually fix
    Regular Expression: on
    Case sensitive: on
    
    
    // Look for ignored tests (FIXME, disabled, ...)
    Find:
    public[ \t]+void[ \t]+\w+test
    Manually fix
    Regular Expression: on
    Case sensitive: on
    
    
    // Look for dummy/empty tests
    Find:
    public[ \t]+void[ \t]+test[\w\d]*\(\s*\)\s*\{\s*(//[^\n]*)?\s*\}
    Manually fix
    Regular Expression: on
    Case sensitive: on
    

    Note: it's important to do them in the order shown above.

提交回复
热议问题