GroovyTestCase does not support @BeforeClass and @AfterClass
groovy, junit4, unit-testing
Solution
I use the `@RunWith` annotation to run these tests using JUnit 4 style to execute the before/after class methods. Example:
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
}
}
Problem
I created a JUnit4 TestCase for my Shard class, but when I try to extend GroovyTestCase it does not run my @BeforeClass and @AfterClass methods. Here is my code ``` 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" } } } ``` When I change the class definition to ``` class ShardUnitTests extends GroovyTestCase{ ``` the beforeClassSetUp() and afterClassTearDown() methods are not called. Is there some other syntax I should be using for these methods, or is it just not compatible with GroovyTestCase?