TransactionSynchronizationManager

时间:2017-10-26 09:56:47

标签: java spring unit-testing asynchronous junit

我找不到一个可行的解决方案,如何对在TransactionSynchronizationManager.registerSynchronization()中发生的事情进行单元测试。我有这样的代码:

pubclic class MyService {
    public void method() {
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter()
                        {
                            @Override
                            public void afterCommit()
                            {
                                myService.callSmth(params);
                            }
                        }
    }
}

这里我调用method():

public class MyClass {

    private MyService myService;

    public void method2() {
        myService.method();
    }
}

在我的单元测试中,我需要验证 myService.callSmth。但似乎测试代码没有进入afterCommit()方法。 那是我的测试班:

@Configurable
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:test-applicationContext.xml" })
public class ServiceTest extends TestHelper
{
    @Mock
    MyService myService;

    @InjectMocks
    MyClass myClass;

    @Test
    public void allowWriteOffGlobal()
    {
         myClass.method();
         veryfy(myService).method();
    }
}

我简化了我的代码,请不要注意,如果这样的嘲笑和smth可能有任何错误。在调试器中,我看到流如何进入TransactionSynchronizationManager.registerSynchronization行并跳过afterCommit()方法。 P.s。:不确定我提供了足够的信息。如果需要额外的smth,请写评论。感谢。

2 个答案:

答案 0 :(得分:1)

来自Spring Test documentation(强调我的):

  

使用@Transactional注释测试方法会导致测试在 一个事务中运行,默认情况下,该事务将在测试完成后自动回滚 。如果使用@Transactional注释测试类,则该类层次结构中的每个测试方法都将在事务中运行。未使用@Transactional注释的测试方法(在类或方法级别)将不会在事务中运行。此外,使用@Transactional注释但传播类型设置为NOT_SUPPORTED的测试将不会在事务中运行。

  

默认情况下,测试完成后将自动回滚测试事务; 但是,事务提交和回滚行为可以通过类级别和方法级别的@Commit和@Rollback注释 以声明方式配置。

所以我建议在你的测试方法中加一个<link href="https://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet"/> <div class="menu_box"> <div class="menu_box_header"> header </div> <div class="row-eq-height"> <div class="menu_options col-xs-6">part1</div> <div class="menu_options col-xs-6">part2</div> <div class="menu_options col-xs-6">part3</div> <div class="menu_options col-xs-6">part4</div> </div> </div>注释。 (根据您描述的行为,我认为您使用的是Spring Test,否则此建议不适用。)

答案 1 :(得分:0)

尝试模拟TransactionSynchronizationAdapter并调用afterCommit()