2014-01-10 91 views
0

我在努力瞭解使用ExternalResource的好處。 documentation和其他帖子(How Junit @Rule works?)都被暗示能夠在一個類中的測試之間共享代碼和/或在測試類之間共享代碼。如何在兩個測試類之間共享ExternalResource?

我想在功能/集成測試中使用ExternalResource作爲數據庫連接,但我沒有看到如何在類中共享該連接。事實上,在這種情況下,我並沒有真正看到@Before/@After的優勢。我是否錯誤地使用了這個或者我錯過了什麼?

public class some_IntegrationTest { 

    private static String id; 
    Connection connection = null; 

    //... 

    @Rule 
    public ExternalResource DBConnectionResource = new ExternalResource() { 
     @Override 
     protected void before() throws SQLException { 
      connection = DbUtil.openConnection(); 
     } 

     @Override 
     protected void after() { 
      DbUtil.closeConnection(connection); 
     } 
    }; 

    @BeforeClass 
    public static void setUpClass() throws SQLException { 
     System.out.println("@BeforeClass setUpClass"); 
     cleanup(id); 
    } 

    //I want to do something like this 
    @Test 
    public void test01() { 
     cleanupData(connection, id); 
     // do stuff... 
    } 

    @Test 
    public void test02() { 
     cleanupTnxLog(connection, id); 
     // do stuff... 
    } 

    //... 


    private static void cleanup(String id) throws SQLException { 
     LOGGER.info("Cleaning up records"); 
     Connection connection = null; 
     try { 
      connection = DbUtil.openConnection(); 
      cleanupData(connection, id); 
      cleanupTnxLog(connection, id); 
     } finally { 
      DbUtil.closeConnection(connection); 
     } 
    } 

    private static void cleanupData(Connection connection, String id) 
     throws SQLException { 
     dao1.delete(connection, id); 
    } 

    private static void cleanupTnxLog(Connection connection, String id) 
     throws SQLException { 
     dao2.delete(connection, id); 
    } 
} 
+0

資源背後的想法是有一些獨立的東西(比如在()之前啓動一個web服務器並在()之後停止它)@RC – 2014-01-10 21:27:33

+0

。我真的不想在測試類之間共享'Connection'對象。但我不明白我能如何避免將同一個規則複製到其他任何類中。該文件特別聲明「ExternalResource是一個規則的基類(如TemporaryFolder),它在測試之前設置了一個外部資源(文件,套接字,服務器,數據庫連接等),並保證在事後纔將其拆除」我認爲我可以將它用於數據庫連接。 – user1766760

+0

我不明白你爲什麼不能在這裏使用規則。 – 2014-01-10 21:38:55

回答

1

我會做這樣的事情:

public class DbConnectionRessource extends ExternalRessource { 

    private Connection connection; 

    @Override 
    protected void before() throws SQLException { 
     connection = DbUtil.openConnection(); 
    } 

    @Override 
    protected void after() { 
     DbUtil.closeConnection(connection); 
    } 

    public Connection getConnection() { 
     return connection; 
    } 
} 

然後在測試這樣使用它:

public class SomeIntegrationTest { 
    @Rule 
    public DbConnectionRessource dbConnectionResource = new DbConnectionRessource(); 

    // ... 

    @Test 
    public void test01() { 
     cleanupData(dbConnectionResource.getConnection(), id); 
     // do stuff... 
    } 

    // ... 
} 

[未測試]

+0

我試過在測試中創建的'ExternalResource'規則之前這樣做(現在我看到當然不會工作,因爲我沒有擴展... pfft) – user1766760