我正在与:
4.3.10
4.12
4.3.1
我有这两个测试类
@Transactional
@RunWith(Parameterized.class)
@ContextConfiguration(classes={RootApplicationContext.class})
@ActiveProfiles(resolver=TestJdbcActiveProfilesResolver.class)
@TestExecutionListeners(listeners={LoggingTestExecutionListener.class}, mergeMode=MergeMode.MERGE_WITH_DEFAULTS)
public class PersonaServiceImplJdbcTest {
@Transactional
@RunWith(Parameterized.class)
@ContextConfiguration(classes={RootApplicationContext.class})
@ActiveProfiles(resolver=TestHibernateActiveProfilesResolver.class)
@TestExecutionListeners(listeners={LoggingTestExecutionListener.class}, mergeMode=MergeMode.MERGE_WITH_DEFAULTS)
public class PersonaServiceImplHibernateTest {
关于@Test
方法的代码对于两个测试类是相同的,打破了DRY
原则,这两个测试类之间的独特差异是jdbc
和Hibernate
配置文件与其他如development, mysql
一起工作,它在内部通过每个TestXXXActiveProfilesResolver
类变体。
直到这里我有2个测试类,打破了DRY
原则,在层次结构中思考我将获得3。
如何(如果可能)使用一个Test类,其中每个交互执行两个(或更多)配置文件集,例如:
jdbc,development,mysql
Hibernate,development,mysql
我已经读过了:
但我想通过Maven
或Gradle
避免使用命令,它通过TestXXXActiveProfilesResolver
类保持控制。
对于JUnit
4,我最后做了以下(向下滚动):
@Transactional
@RunWith(Parameterized.class)
@ContextConfiguration(classes={RootApplicationContext.class})
//@ActiveProfiles() ... disable
@TestExecutionListeners(listeners={LoggingTestExecutionListener.class}, mergeMode=MergeMode.MERGE_WITH_DEFAULTS)
public abstract class PersonaServiceImplTest {
...
@Autowired
private Environment environment;
@Before
public void setup(){
logger.info("Profiles: {}", Arrays.toString(environment.getActiveProfiles()));
}
//@Test disable
public void someTest(){
assertThat(...)
}
@ActiveProfiles(resolver=TestJdbcActiveProfilesResolver.class)
public static class ForJdbc extends PersonaServiceImplTest {
public ForJdbc(Persona persona){
super(persona);
}
@Test
@Override
@Sql(scripts={"classpath:/.../script.sql"})//when be necessary
public void someTest()(){
super.someTest()();
}
}
@ActiveProfiles(resolver=TestHibernateActiveProfilesResolver.class)
public static class ForHibernate extends PersonaServiceImplTest {
public ForHibernate(Persona persona){
super(persona);
}
@Test
@Override
@Sql(scripts={"classpath:/.../script.sql"})//when be necessary
public void someTest()(){
super.someTest()();
}
...
}
}
观察:
outer class
必须是abstract
outer class
必须没有宣布@ActiveProfiles
outer class
有待测试的方法,每个人都必须没有宣布@Test
Environment
是可选的,但有用的是让我们知道为每个static nested class
激活的配置文件,它通过使用@Before
注释的常用方法static nested class
必须是public
static nested class
必须扩展outer class
static nested class
必须有@ActiveProfiles
static nested class
都会覆盖每个测试方法,只是为了使用super
调用相应的重写方法static nested class
,对于每个测试覆盖的方法,它必须有@Test
。@Sql
不能重用,必须为每个重写方法声明它