如题,
最近在研究Junit 4 的用法,因为最近有个Spring 的项目即将启动,当然项目启动必然需要测试,本想反正测试框架是要搭建的,索性在开发之前先研究一下Junit4 。
当然JUnit 4 增加了不少功能,参数化测试,还有个Rule的问题,这些在官方教程都有,所以也都不是难题。
大家都是到Spring有自己的Runner,SpringJUnit4ClassRunner 继承自BlockJUnit4ClassRunner,如果想测试Spring的东西只要在测试用例前加上注解,如下就行了
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/config/*.xml" })
public class TestCase{
}
当然如果想参数化测试就在测试类前加注解,然后进行一番教程般的配置就OK,如下
@RunWith(Parameterized.class)
public class TestCase{
}
估计各位已经看到问题所在了,上源码public interface RunWith extends Annotation {
public abstract Class value();
}
RunWith 这个注解可是不支持2个参数啊SpringJUnit4ClassRunner,Parameterized,任选其一可达不到我们的要求啊
于是乎莫非不能共存,不该啊。。。
估计 Spring这么大名鼎鼎的框架这点都没有考虑到,不该啊,
只是看看Spring的测试包,忽然发现有这么一个东东, org.springframework.test.context.TestContextManager
豁然开朗啊。。。。
上代码,
//@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(Parameterized.class)
@ContextConfiguration(locations = { "classpath:/config/*.xml" })
public class TestCase{
protected final Log logger = LogFactory.getLog(getClass());
private TestContextManager testContextManager;
@Before
public void setUpContext() throws Exception {
//仔细看这里 哈哈被你法发现了,spring Runner 不就是做的这个工作嘛。。。。。
this.testContextManager = new TestContextManager(getClass());
this.testContextManager.prepareTestInstance(this);
}
@Test
public void test(){}
//关于参数化配置的代码就忽略了
}
PS,高兴之余细看这代码还是有问题的,TestContextManager 这个东东每次都要被初始化一次,不过好像不能移动到@BeforeClass 毕竟我对TestContextManager 理解不够深,如果可以再次改造请留言