我正在使用:
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
和{{1} }个人资料与其他Hibernate
一起工作,内部通过每个development, mysql
类变体。
直到这里我有2个测试类,违反了TestXXXActiveProfilesResolver
原则,在层次结构中思考我将获得3个。
如何(如果可能)使用一个测试类,其中每个交互执行两个(或更多)配置文件集,例如:
DRY
jdbc,development,mysql
我已经读过:
但我希望避免通过Hibernate,development,mysql
或Maven
使用命令,以保持对Gradle
类的控制。
答案 0 :(得分:1)
对于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
无法重复使用,必须为每个重写方法声明