TestCase에서 @Transactional 어노테이션을 사용할 수 없습니다. 나는 해결 방법을 가지고있다 - 직접 TransactionalManager를 사용한다. 불행히도 SpringContext에서 DataSource를 기반으로 Groovy에서 Sql 객체를 생성하고 롤백하지 않는 데이터베이스에 행을 삽입 할 때.그루비에서 트랜잭션을 롤백하는 방법
@ContextConfiguration(locations = [ "../dao/impl/ibatis/spring-data-context-config.xml"])
@RunWith(SpringJUnit4ClassRunner.class)
public class OrganizationTest {
@Autowired
DataSource dataSource;
@Autowired
DataSourceTransactionManager transactionManager;
private TransactionStatus transactionStatus;
@Before
public void setUp() {
transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
}
@After
public void tearDown() {
transactionManager.rollback(transactionStatus);
transactionStatus = null;
}
@Test
public void shallObtainSequenceNo() throws Exception {
Connection connection = dataSource.getConnection();
connection.setAutoCommit(false);
Sql sql = new Sql(dataSource);
//given
Organization organization = new Organization("KongregatzionIX", "bisut000000000000001");
//when
organization.insert(sql);
//then
assertNotNull(organization.getId());
}
}
SQL 쿼리는 다음과 같습니다 : 물론
public class Organization {
String name;
String id;
String parentId;
Organization(String name, String parentId){
this.name = name;
this.parentId = parentId;
}
public void insert(Sql sql){
String createdBy = GlobalConstant.SABA_ADMIN_ID.getValue();
String updatedBy = GlobalConstant.SABA_ADMIN_ID.getValue();
String companyType = "2";
String flags = "1000000000";
id = sql.firstRow("select 'bisut' || LPAD(TPT_COMPANY_SEQ.NEXTVAL, 15, '0') as id from dual ").id;
def timeStamp = sql.firstRow("select to_char(SYSTIMESTAMP, 'YYYYMMDDHH24MISSFF') as ts FROM DUAL ").ts;
def nameIns = name;
def today = new java.sql.Date(new Date().getTime());
sql.executeInsert('''
INSERT INTO TPT_COMPANY(ID, TIME_STAMP, CREATED_BY, CREATED_ON, UPDATED_BY, UPDATED_ON, CI_NAME, NAME, CI_NAME2, NAME2, COMPANY_TYPE, FLAGS, PARENT_ID)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)
''' ,
[id, timeStamp, createdBy, today, updatedBy, today, nameIns.toLowerCase(), nameIns, nameIns.toLowerCase(), nameIns, companyType, flags, parentId]);
}
}
내가 모든 시험 방법에 걸쳐있는 트랜잭션을 설정합니다.
// EDIT
나는 때문에 너무 작은 명성에 대답 할 수는 없지만에 TransactionAwareDataSourceProxy 내가 찾고 있던 것입니다.