【问题标题】:integration testing spring service layer based on migrated data基于迁移数据的集成测试spring服务层
【发布时间】:2012-02-25 05:21:01
【问题描述】:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/applicationContext-test.xml"})
@Transactional
public class MyServiceTest {

    @Resource(name="myService")
    public MyService myService;

    @Test
    public void testSeomthing() {
    //do some asserts using myService.whatever()
    }
}

但是测试是基于我迁移的数据,所以每次我运行我的测试套件时,我都想执行我不相关的迁移代码。我不想在每个测试类中运行@Before。我想在完整的测试过程开始时运行一次,我可以把它放在哪里?

【问题讨论】:

    标签: java spring junit integration-testing junit4


    【解决方案1】:

    我建议你在某个地方创建一个测试 bean,并在 @PostConstruct 中调用启动逻辑:

    @Service
    public class TestBean {
    
        @PostConstruct
        public void init() {
            //startup logic here
        }
    
    }
    

    显然,这个 bean 应该只为测试而创建,实现这一点的最简单方法是将其放在 src/test/java 的包中,该包由 Spring 为 @Service-annotated 类提供 component-scanned。

    注意:您必须记住@PostConstruct 没有在事务中运行!见How to call method on spring proxy once initialised

    【讨论】:

      【解决方案2】:

      JUnit 还提供了一个 @BeforeClass 注解,您可以将它放在一个静态方法上,以便只初始化一次资源。

      【讨论】:

      • 谢谢,但我完全不明白。我有一个单独的类,它有一个静态方法,我会注释?还是每个测试类中的静态方法?
      • 每个测试类中的一个静态方法。不完全确定 @BeforeClass 是否被继承。 (可能需要查看相关文档)
      • 那么它将为每个测试类运行吗?我希望它为所有测试运行一次...?
      • 它将为每个测试类运行,是的。如果您需要在所有测试之前运行一次方法,您应该创建一个 TestCase 并在其中创建该方法。添加的依赖项是您必须始终通过 TestCase 运行测试。
      猜你喜欢
      • 2015-06-24
      • 2021-02-08
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 2015-03-23
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多