我找不到一个可行的解决方案,如何对在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,请写评论。感谢。
答案 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()