red*_*hka 7 java junit spring hibernate transactions
所有MyService方法都是事务性的.下面的junit测试,获取项目数,保存新项目,并获取项目数,以确保计数增加1.
public class MyTest extends ServiceTest{
1. int countBefore = myService.getCount(); //return n
2. myService.add(item); //item is really added to DB
3. int countAfter = myService.getCount(); //return n (sometimes n+1)
}
@Transactional(propagation=Propagation.REQUIRES_NEW, isolation=Isolation.READ_COMMITTED)
getCount(){…}
@Transactional(propagation=Propagation.REQUIRES_NEW, isolation=Isolation.SERIALIZABLE)
add(){…}
Run Code Online (Sandbox Code Playgroud)
@Ignore
@ContextConfiguration(locations = { "file:src/main/resources/xxx-context.xml",
"file:src/main/resources/xxx-data.xml",
"file:src/main/resources/xxx-services.xml" })
@TransactionConfiguration(transactionManager = "txManager", defaultRollback = false)
@TestExecutionListeners( { DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class,
TestListener.class})
public class ServiceTest extends AbstractUT{
Run Code Online (Sandbox Code Playgroud)
@Ignore
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners( {TestListener.class})
public class AbstractUT{
Run Code Online (Sandbox Code Playgroud)
调试时(3.)返回n + 1,这就是我想要的.但是在没有调试的情况下运行测试时我得到了n.
甚至有时在运行测试时我得到n + 1,下次我得到n并且在比较两次执行之间的std输出时,它看起来完全一样.我启用了log4j.logger.org.springframework.transaction = TRACE,我可以看到:
Initializing transaction synchronization
Getting transaction for MyService.getCount
...
Completing transaction for MyService.getCount
Clearing transaction synchronization
...
Initializing transaction synchronization
Getting transaction for MyService.add
...
Completing transaction for MyService.add
Clearing transaction synchronization
...
Initializing transaction synchronization
Getting transaction for MyService.getCount
...
Completing transaction for MyService.getCount
Clearing transaction synchronization
Run Code Online (Sandbox Code Playgroud)
因此交易一个接一个地执行,但是(3.)怎么可能看不到保存的项目?
交易管理在我的测试类中设置如下:https://stackoverflow.com/a/28657650/353985
我怎样才能找到出错的地方?谢谢!
小智 5
有类似的问题,但就我而言,它没有回滚。看来您忘记添加@Transactional。来自文档(链接)
交易管理
在 TestContext 框架中,事务由默认配置的 TransactionalTestExecutionListener 管理,即使您没有在测试类上显式声明 @TestExecutionListeners 也是如此。但是,要启用对事务的支持,您必须在通过 @ContextConfiguration 语义加载的 ApplicationContext 中配置 PlatformTransactionManager bean(下面提供了更多详细信息)。此外,您必须在类或方法级别为您的测试声明 Spring 的 @Transactional 注释。
这是上面链接的示例。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@TransactionConfiguration(transactionManager="txMgr", defaultRollback=false)
@Transactional
public class FictitiousTransactionalTest {
@BeforeTransaction
public void verifyInitialDatabaseState() {
// logic to verify the initial state before a transaction is started
}
@Before
public void setUpTestDataWithinTransaction() {
// set up test data within the transaction
}
@Test
// overrides the class-level defaultRollback setting
@Rollback(true)
public void modifyDatabaseWithinTransaction() {
// logic which uses the test data and modifies database state
}
@After
public void tearDownWithinTransaction() {
// execute "tear down" logic within the transaction
}
@AfterTransaction
public void verifyFinalDatabaseState() {
// logic to verify the final state after transaction has rolled back
}
Run Code Online (Sandbox Code Playgroud)
}
| 归档时间: |
|
| 查看次数: |
5862 次 |
| 最近记录: |