programing

Spring Boot 테스트에서 트랜잭션 커밋을 강제하는 방법은 무엇입니까?

muds 2023. 7. 10. 22:59
반응형

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

반응형