2012-10-15 53 views
4

我需要在每个JUnit测试方法之前执行一段代码。为了执行这段代码,我使用了SpringTest类AbstractTestExecutionListener及其子TransactionContextTestExecutionListener。JUnit - 之前的方法

这是代码:

public class TransactionContextTestExecutionListener extends AbstractTestExecutionListener{ 

    private static final Logger logger = Logger.getLogger(TransactionContextTestExecutionListener.class); 


    @Override 
    public void beforeTestMethod(TestContext testContext) throws Exception { 
     Object ctx = testContext.getApplicationContext().getBean(Context.class); 
} 

我的JUnit类的样子:

@ContextConfiguration(locations = "classpath:/META-INF/spring-test/tests-context.xml") 
@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners(TransactionContextTestExecutionListener.class) 
@Transactional 
public class SelectQueryBuilderTest {} 

问题是,前第一执行 测试方法beforeTestMethod方法只调用。在所有其他人之前并没有被召唤。

配置有问题吗?任何想法?

感谢

+2

只是好奇,如果你已经尝试了标准的JUnit @Before注解? – btiernay

回答

6

我会建议尝试@Before。例如,请考虑您的测试创建一个基类:

@ContextConfiguration(locations = "classpath:/META-INF/spring-test/tests-context.xml") 
@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners(TransactionContextTestExecutionListener.class) 
@Transactional 
public class BaseQueryBuilderTest { 
    @Autowired 
    private ApplicationContext applicationContext; 
    protected Context context; 

    @Before 
    public void setUp() { 
     context = applicationContext.getBean(Context.class); 
    } 
} 

现在你可以按如下编写测试执行:

public class SelectQueryBuilderTest extends BaseQueryBuilderTest { 
    @Test 
    public void test() { 
     // Use context 
    } 
} 

一个这种方法的好处是,它封装了很多的基础类中的元数据,从而不必将其复制到所有实际的测试类中。

11

当你与SpringJUnit4ClassRunner运行你的JUnit类,您可以用这些JUnit 4注释:

@Before 
public void multipleInit() { 
    // Called before each method annotated with @Test 
    ... 
} 

@BeforeClass 
public static void initAll() { 
    // Called once per class, before any method annotated with @Test is called 
    ... 
}