2014-04-18 56 views
4

我爲我的Shard類創建了一個JUnit4 TestCase,但是當我嘗試擴展GroovyTestCase時,它不運行我的@BeforeClass和@AfterClass方法。GroovyTestCase不支持@BeforeClass和@AfterClass

這裏是我的代碼

import groovy.sql.* 
import org.junit.* 

class ShardUnitTests { 
    static def shard 
    static def sql 
    static def mysqlserver = "REDACTED" 
    @BeforeClass 
    static void beforeClassSetUp(){ 
     def db = [url:'jdbc:mysql://${mysqlserver}:3306/test', user:'root', password:'password', driver:'com.mysql.jdbc.Driver'] 
     sql = Sql.newInstance(db.url, db.user, db.password, db.driver) 
     shard = new Shard(sql: sql) 
    } 
    @AfterClass 
    static void afterClassTearDown(){ 
     sql.execute("DROP TABLE test") 
     sql.close() 
    } 
    @Test 
    //Test that createObjectTable creates a table with 2 columns 
    void testCreateObjectTable(){ 
     shard.createObjectTable("test") 
     sql.rows("SELECT * FROM test"){meta -> 
      assert meta.getColumnName(1) == "id" 
      assert meta.getColumnName(2) == "data" 
     } 
    } 
} 

當我改變類定義

class ShardUnitTests extends GroovyTestCase{ 

的beforeClassSetUp()和afterClassTearDown()方法不會被調用。 有沒有其他的語法我應該使用這些方法,或者它只是與GroovyTestCase不兼容?

+0

您看過「GroovyTestCase」類嗎? – dmahapatro

+0

是的,我查看了CodeHaus上的API文檔。我知道我可以聲明setUp()和tearDown()在每個案例之前和之後運行,但我想嘗試一個數據庫設置並拆除整個測試集。 這可能嗎? –

+2

'GroovyTestCase'是'JUnit 3'風格,JUnit 3不支持這個。看看這個問題http://stackoverflow.com/questions/7208593/how-can-i-get-beforeclass-and-afterclass-equivalent-in-junit3 – Dany

回答

4

我使用@RunWith註釋來運行這些使用JUnit 4風格的測試來執行before/after類方法。示例:

package org.apache 

import org.apache.log4j.Logger 
import org.bouncycastle.jce.provider.BouncyCastleProvider 
import org.junit.* 

import org.junit.runner.RunWith 
import org.junit.runners.JUnit4 

import java.security.Security 

@RunWith(JUnit4.class) 
class SomeClassTest extends GroovyTestCase { 
    private static final Logger logger = Logger.getLogger(SomeClassTest.class) 

    private SomeClass someClass 

    @BeforeClass 
    static void setUpOnce() { 
     // Do things once for the whole test suite 

     logger.metaClass.methodMissing = { String name, args -> 
      logger.info("[${name?.toUpperCase()}] ${(args as List).join(" ")}") 
     } 

     Security.addProvider(new BouncyCastleProvider()) 
    } 

    @Before 
    void setUp() { 
     // Do things before every test case 
     someClass = new SomeClass() 
    } 

    @After 
    void tearDown() { 
     // Do things after every test case 
    } 

    @AfterClass 
    static void tearDownOnce() { 
     // Do things once for the whole test suite 
    } 

    @Test 
    void testShouldDoSomething() { 
     // Arrange 

     // Act 
     int result = someClass.doSomething() 

     // Assert 
     assert result == 0 
    } 
} 
+0

非常好...兩全其美。但是,無論如何,你只能「RunWith」一個跑步者。除非Groovy中的這種情況不同(我目前是新手),這可能有點缺點...... –