📄 jtatransactiontestsuite.java
字号:
/*
* Copyright 2002-2004 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.transaction;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.Status;
import javax.transaction.SystemException;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;
import junit.framework.TestCase;
import org.easymock.MockControl;
import org.springframework.transaction.jta.JtaTransactionManager;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationAdapter;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.transaction.support.TransactionTemplate;
/**
* @author Juergen Hoeller
* @since 12.05.2003
*/
public class JtaTransactionTestSuite extends TestCase {
/**
* Prevent any side-effects due to this test
* modifying ThreadLocals that might affect subsequent
* tests when all tests are run in the same JVM, as
* with Eclipse
* @see junit.framework.TestCase#tearDown()
*/
protected void tearDown() {
if (TransactionSynchronizationManager.isSynchronizationActive()) {
TransactionSynchronizationManager.clearSynchronization();
}
}
public void testJtaTransactionManagerWithCommit() throws Exception {
MockControl utControl = MockControl.createControl(UserTransaction.class);
UserTransaction ut = (UserTransaction) utControl.getMock();
ut.getStatus();
utControl.setReturnValue(Status.STATUS_NO_TRANSACTION, 1);
ut.getStatus();
utControl.setReturnValue(Status.STATUS_ACTIVE, 1);
ut.begin();
utControl.setVoidCallable(1);
ut.commit();
utControl.setVoidCallable(1);
utControl.replay();
MockControl synchControl = MockControl.createControl(TransactionSynchronization.class);
final TransactionSynchronization synch = (TransactionSynchronization) synchControl.getMock();
synch.beforeCommit(false);
synchControl.setVoidCallable(1);
synch.beforeCompletion();
synchControl.setVoidCallable(1);
synch.afterCompletion(TransactionSynchronization.STATUS_COMMITTED);
synchControl.setVoidCallable(1);
synchControl.replay();
JtaTransactionManager ptm = new JtaTransactionManager(ut);
TransactionTemplate tt = new TransactionTemplate(ptm);
assertEquals(JtaTransactionManager.SYNCHRONIZATION_ALWAYS, ((JtaTransactionManager) tt.getTransactionManager()).getTransactionSynchronization());
assertTrue(!TransactionSynchronizationManager.isSynchronizationActive());
tt.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
// something transactional
assertTrue(TransactionSynchronizationManager.isSynchronizationActive());
TransactionSynchronizationManager.registerSynchronization(synch);
}
});
assertTrue(!TransactionSynchronizationManager.isSynchronizationActive());
utControl.verify();
synchControl.verify();
}
public void testJtaTransactionManagerWithCommitAndSynchronizationOnActual() throws Exception {
MockControl utControl = MockControl.createControl(UserTransaction.class);
UserTransaction ut = (UserTransaction) utControl.getMock();
ut.getStatus();
utControl.setReturnValue(Status.STATUS_NO_TRANSACTION, 1);
ut.getStatus();
utControl.setReturnValue(Status.STATUS_ACTIVE, 1);
ut.begin();
utControl.setVoidCallable(1);
ut.commit();
utControl.setVoidCallable(1);
utControl.replay();
MockControl synchControl = MockControl.createControl(TransactionSynchronization.class);
final TransactionSynchronization synch = (TransactionSynchronization) synchControl.getMock();
synch.beforeCommit(false);
synchControl.setVoidCallable(1);
synch.beforeCompletion();
synchControl.setVoidCallable(1);
synch.afterCompletion(TransactionSynchronization.STATUS_COMMITTED);
synchControl.setVoidCallable(1);
synchControl.replay();
JtaTransactionManager ptm = new JtaTransactionManager(ut);
TransactionTemplate tt = new TransactionTemplate(ptm);
ptm.setTransactionSynchronization(JtaTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION);
assertTrue(!TransactionSynchronizationManager.isSynchronizationActive());
tt.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
// something transactional
assertTrue(TransactionSynchronizationManager.isSynchronizationActive());
TransactionSynchronizationManager.registerSynchronization(synch);
}
});
assertTrue(!TransactionSynchronizationManager.isSynchronizationActive());
utControl.verify();
synchControl.verify();
}
public void testJtaTransactionManagerWithCommitAndSynchronizationNever() throws Exception {
MockControl utControl = MockControl.createControl(UserTransaction.class);
UserTransaction ut = (UserTransaction) utControl.getMock();
ut.getStatus();
utControl.setReturnValue(Status.STATUS_NO_TRANSACTION, 1);
ut.getStatus();
utControl.setReturnValue(Status.STATUS_ACTIVE, 1);
ut.begin();
utControl.setVoidCallable(1);
ut.commit();
utControl.setVoidCallable(1);
utControl.replay();
JtaTransactionManager ptm = new JtaTransactionManager(ut);
TransactionTemplate tt = new TransactionTemplate(ptm);
ptm.setTransactionSynchronization(JtaTransactionManager.SYNCHRONIZATION_NEVER);
assertTrue(!TransactionSynchronizationManager.isSynchronizationActive());
tt.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
assertTrue(!TransactionSynchronizationManager.isSynchronizationActive());
}
});
assertTrue(!TransactionSynchronizationManager.isSynchronizationActive());
utControl.verify();
}
public void testJtaTransactionManagerWithRollback() throws Exception {
MockControl utControl = MockControl.createControl(UserTransaction.class);
UserTransaction ut = (UserTransaction) utControl.getMock();
ut.getStatus();
utControl.setReturnValue(Status.STATUS_NO_TRANSACTION, 1);
ut.setTransactionTimeout(10);
utControl.setVoidCallable(1);
ut.begin();
utControl.setVoidCallable(1);
ut.rollback();
utControl.setVoidCallable(1);
utControl.replay();
MockControl synchControl = MockControl.createControl(TransactionSynchronization.class);
final TransactionSynchronization synch = (TransactionSynchronization) synchControl.getMock();
synch.beforeCompletion();
synchControl.setVoidCallable(1);
synch.afterCompletion(TransactionSynchronization.STATUS_ROLLED_BACK);
synchControl.setVoidCallable(1);
synchControl.replay();
JtaTransactionManager ptm = new JtaTransactionManager(ut);
TransactionTemplate tt = new TransactionTemplate(ptm);
tt.setTimeout(10);
assertTrue(!TransactionSynchronizationManager.isSynchronizationActive());
tt.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
assertTrue(TransactionSynchronizationManager.isSynchronizationActive());
TransactionSynchronizationManager.registerSynchronization(synch);
status.setRollbackOnly();
}
});
assertTrue(!TransactionSynchronizationManager.isSynchronizationActive());
utControl.verify();
synchControl.verify();
}
public void testJtaTransactionManagerWithRollbackAndSynchronizationOnActual() throws Exception {
MockControl utControl = MockControl.createControl(UserTransaction.class);
UserTransaction ut = (UserTransaction) utControl.getMock();
ut.getStatus();
utControl.setReturnValue(Status.STATUS_NO_TRANSACTION, 1);
ut.setTransactionTimeout(10);
utControl.setVoidCallable(1);
ut.begin();
utControl.setVoidCallable(1);
ut.rollback();
utControl.setVoidCallable(1);
utControl.replay();
MockControl synchControl = MockControl.createControl(TransactionSynchronization.class);
final TransactionSynchronization synch = (TransactionSynchronization) synchControl.getMock();
synch.beforeCompletion();
synchControl.setVoidCallable(1);
synch.afterCompletion(TransactionSynchronization.STATUS_ROLLED_BACK);
synchControl.setVoidCallable(1);
synchControl.replay();
JtaTransactionManager ptm = new JtaTransactionManager(ut);
TransactionTemplate tt = new TransactionTemplate(ptm);
ptm.setTransactionSynchronization(JtaTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION);
tt.setTimeout(10);
assertTrue(!TransactionSynchronizationManager.isSynchronizationActive());
tt.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
assertTrue(TransactionSynchronizationManager.isSynchronizationActive());
TransactionSynchronizationManager.registerSynchronization(synch);
status.setRollbackOnly();
}
});
assertTrue(!TransactionSynchronizationManager.isSynchronizationActive());
utControl.verify();
synchControl.verify();
}
public void testJtaTransactionManagerWithRollbackAndSynchronizationNever() throws Exception {
MockControl utControl = MockControl.createControl(UserTransaction.class);
UserTransaction ut = (UserTransaction) utControl.getMock();
ut.getStatus();
utControl.setReturnValue(Status.STATUS_NO_TRANSACTION, 1);
ut.setTransactionTimeout(10);
utControl.setVoidCallable(1);
ut.begin();
utControl.setVoidCallable(1);
ut.rollback();
utControl.setVoidCallable(1);
utControl.replay();
JtaTransactionManager ptm = new JtaTransactionManager(ut);
TransactionTemplate tt = new TransactionTemplate(ptm);
ptm.setTransactionSynchronizationName("SYNCHRONIZATION_NEVER");
tt.setTimeout(10);
assertTrue(!TransactionSynchronizationManager.isSynchronizationActive());
tt.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
assertTrue(!TransactionSynchronizationManager.isSynchronizationActive());
status.setRollbackOnly();
}
});
assertTrue(!TransactionSynchronizationManager.isSynchronizationActive());
utControl.verify();
}
public void testJtaTransactionManagerWithExistingTransaction() throws Exception {
MockControl utControl = MockControl.createControl(UserTransaction.class);
UserTransaction ut = (UserTransaction) utControl.getMock();
ut.getStatus();
utControl.setReturnValue(Status.STATUS_ACTIVE, 1);
ut.setRollbackOnly();
utControl.setVoidCallable(1);
utControl.replay();
MockControl synchControl = MockControl.createControl(TransactionSynchronization.class);
final TransactionSynchronization synch = (TransactionSynchronization) synchControl.getMock();
synch.beforeCompletion();
synchControl.setVoidCallable(1);
synch.afterCompletion(TransactionSynchronization.STATUS_ROLLED_BACK);
synchControl.setVoidCallable(1);
synchControl.replay();
JtaTransactionManager ptm = new JtaTransactionManager(ut);
TransactionTemplate tt = new TransactionTemplate(ptm);
assertTrue(!TransactionSynchronizationManager.isSynchronizationActive());
tt.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
assertTrue(TransactionSynchronizationManager.isSynchronizationActive());
TransactionSynchronizationManager.registerSynchronization(synch);
status.setRollbackOnly();
}
});
assertTrue(!TransactionSynchronizationManager.isSynchronizationActive());
utControl.verify();
synchControl.verify();
}
public void testJtaTransactionManagerWithExistingTransactionAndSynchronizationOnActual() throws Exception {
MockControl utControl = MockControl.createControl(UserTransaction.class);
UserTransaction ut = (UserTransaction) utControl.getMock();
ut.getStatus();
utControl.setReturnValue(Status.STATUS_ACTIVE, 1);
ut.setRollbackOnly();
utControl.setVoidCallable(1);
utControl.replay();
MockControl synchControl = MockControl.createControl(TransactionSynchronization.class);
final TransactionSynchronization synch = (TransactionSynchronization) synchControl.getMock();
synch.beforeCompletion();
synchControl.setVoidCallable(1);
synch.afterCompletion(TransactionSynchronization.STATUS_ROLLED_BACK);
synchControl.setVoidCallable(1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -