为许多不同的配置文件测试一个Spring Test Class

问题描述 投票:2回答:1

我正在与:

  • Spring Framework 4.3.10
  • JUnit 4.12
  • Gradle 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原则,这两个测试类之间的独特差异是jdbcHibernate配置文件与其他如development, mysql一起工作,它在内部通过每个TestXXXActiveProfilesResolver类变体。

直到这里我有2个测试类,打破了DRY原则,在层次结构中思考我将获得3。

如何(如果可能)使用一个Test类,其中每个交互执行两个(或更多)配置文件集,例如:

  • jdbc,development,mysql
  • Hibernate,development,mysql

我已经读过了:

但我想通过MavenGradle避免使用命令,它通过TestXXXActiveProfilesResolver类保持控制。

java spring junit
1个回答
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不能重用,必须为每个重写方法声明它
© www.soinside.com 2019 - 2024. All rights reserved.