public void testPerformInTransaction_ExistingTx() {

    final BaseTransaction tx1 = mock(BaseTransaction.class);
    TransactionFactory txFactory = mock(TransactionFactory.class);
    when(txFactory.createTransaction()).thenReturn(tx1);

    DefaultTransactionManager txManager =
        new DefaultTransactionManager(txFactory, mock(JdbcEventLogger.class));

    final BaseTransaction tx2 = mock(BaseTransaction.class);
    BaseTransaction.bindThreadTransaction(tx2);
    try {

      final Object expectedResult = new Object();
      Object result =
          txManager.performInTransaction(
              new TransactionalOperation<Object>() {
                public Object perform() {
                  assertSame(tx2, BaseTransaction.getThreadTransaction());
                  return expectedResult;
                }
              });

      assertSame(expectedResult, result);
    } finally {
      BaseTransaction.bindThreadTransaction(null);
    }
  }