반응형
Spring Boot 테스트에서 트랜잭션 커밋을 강제하는 방법은 무엇입니까?
메서드를 실행하는 동안(Spring Data 사용) Spring Boot에서 트랜잭션 커밋을 강제로 실행하지 않고 어떻게 해야 합니까?
나는 여기서 그것이 가능해야 한다는 것을 읽었습니다.@Transactional(propagation = Propagation.REQUIRES_NEW)
다른 수업에서 하지만 저는 통하지 않습니다.
힌트?Spring Boot v1.5.2를 사용하고 있습니다.풀어주다.
@RunWith(SpringRunner.class)
@SpringBootTest
public class CommitTest {
@Autowired
TestRepo repo;
@Transactional
@Commit
@Test
public void testCommit() {
repo.createPerson();
System.out.println("I want a commit here!");
// ...
System.out.println("Something after the commit...");
}
}
@Repository
public class TestRepo {
@Autowired
private PersonRepository personRepo;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void createPerson() {
personRepo.save(new Person("test"));
}
}
도우미 클래스 사용org.springframework.test.context.transaction.TestTransaction
(4.1 봄 이후).
테스트는 기본값에 따라 롤백됩니다.정말로 해야 할 일을 약속하는 것.
// do something before the commit
TestTransaction.flagForCommit(); // need this, otherwise the next line does a rollback
TestTransaction.end();
TestTransaction.start();
// do something in new transaction
한 가지 접근법은 주사하는 것입니다.TransactionTemplate
테스트 클래스에서 다음을 제거합니다.@Transactional
그리고.@Commit
다음과 같은 방법으로 테스트 방법을 수정합니다.
...
public class CommitTest {
@Autowired
TestRepo repo;
@Autowired
TransactionTemplate txTemplate;
@Test
public void testCommit() {
txTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
repo.createPerson();
// ...
}
});
// ...
System.out.println("Something after the commit...");
}
또는
new TransactionCallback<Person>() {
@Override
public Person doInTransaction(TransactionStatus status) {
// ...
return person
}
// ...
});
대신에TransactionCallbackWithoutResult
방금 지속된 사용자 개체에 어설션을 추가하려는 경우 콜백임플을 선택합니다.
람다를 사용한 솔루션.
import java.lang.Runnable;
import java.util.function.Supplier;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.support.TransactionTemplate;
@Autowired
TestRepo repo;
@Autowired
TransactionTemplate txTemplate;
private <T> T doInTransaction(Supplier<T> operation) {
return txTemplate.execute(status -> operation.get());
}
private void doInTransaction(Runnable operation) {
txTemplate.execute(status -> {
operation.run();
return null;
});
}
로 사용.
Person saved = doInTransaction(() -> repo.save(buildPerson(...)));
doInTransaction(() -> repo.delete(person));
언급URL : https://stackoverflow.com/questions/44079793/how-to-force-transaction-commit-in-spring-boot-test
반응형
'programing' 카테고리의 다른 글
쿠키에 암호를 저장하는 것이 안전합니까? (0) | 2023.07.10 |
---|---|
Oracle 상수를 단일 테이블로 병합 (0) | 2023.07.10 |
자동 구성을 중단하지 않고 Spring-Boot에서 MappingMongoConverter(setMapKeyDotReplacement)를 사용자 지정하는 방법은 무엇입니까? (0) | 2023.07.10 |
가지고 놀만한 흥미로운 C/C++ 라이브러리는 무엇입니까? (0) | 2023.07.10 |
오래된 Git commit을 어떻게 수정합니까? (0) | 2023.07.10 |