Вручную выполнить код в транзакции в тесте с откатом - PullRequest
0 голосов
/ 20 сентября 2018

мы используем весеннюю загрузку 2, и в наших интеграционных тестах нам нужно вручную выполнить некоторый код в транзакции, а в конце транзакции и после подтверждений мы хотим откатить эту транзакцию.

Мы используем явныйопределенные транзакции вместо @Transactional, потому что иногда нам нужно выполнить в тесте 2 транзакции.

вот пример теста:

@Test
public void fooTest() {

    // transaction 1
    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                // some code in transaction
            }

    // transaction 2
    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                // some code in transaction
            }

    // here I need rollback these transactions for clean db for another tests
}

Можете ли вы сказать мне, как использовать откат в нашем случае для откатаобе транзакции?Это немного более старый код, который мы поддерживаем, поэтому, если это возможно сделать лучше при загрузке 2, я буду благодарен за любой совет.Мы просто должны выполнить 2 транзакции в одном тесте.

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Если вам действительно нужно запустить две транзакции, которые выполняются независимо, выполняя некоторую работу с каждой из них, и вам необходимо проверить некоторые утверждения после того, как они оба запустятся, но до того, как они будут зафиксированы или откатаны, - а затем необходимо зафиксировать илиОткат обоих после утверждений, вам нужно будет установить свою собственную многопоточную структуру ... Что-то вроде:

execute(AssertCallback aC, TransactionCallback ... tCs);

Этот метод будет запускать поток для каждого из TC.Каждый поток будет вызывать метод обратного вызова в каждом из них и при возврате блока на барьере, пока все потоки, выполняющие tC, не достигнут этой же точки.Основной поток также будет ожидать блокировки всех потоков tC, а затем запустит обратный вызов aC, а когда он вернется, освободит все потоки tC, чтобы они могли зафиксировать / откатить и выйти.

Itвсе кажется немного странным в том, что обратный вызов aC не может «увидеть» какую-либо работу, выполненную любым из обратных вызовов tC, поскольку это происходит в транзакциях, которые еще не были зафиксированы.

Я никогда не виделэто реализовано ... Но, если вы хотите увидеть то, о чем я говорил, взгляните на проект параллельных тестов здесь: https://github.com/moilejter/examples.git

0 голосов
/ 23 октября 2018

Сохраните ссылки на каждый TransactionStatus в AtomicReference и откатите их с помощью диспетчера транзакций после теста.

@Test
void test() {
  final AtomicReference<TransactionStatus> first = new AtomicReference<>();
  final AtomicReference<TransactionStatus> second = new AtomicReference<>();
  transactionTemplate.execute(new TransactionCallbackWithoutResult() {
    @Override
    protected void doInTransactionWithoutResult(TransactionStatus status) {
      // some code in transaction
      first.set(status);
    }
  });

  // transaction 2
  transactionTemplate.execute(new TransactionCallbackWithoutResult() {
    @Override
    protected void doInTransactionWithoutResult(TransactionStatus status) {
      // some code in transaction
      second.set(status);
    }
  });
  transactionTemplate.getTransactionManager().rollback(first.get());
  transactionTemplate.getTransactionManager().rollback(second.get());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...