|
27 | 27 | import org.junit.jupiter.api.BeforeEach;
|
28 | 28 | import org.junit.jupiter.api.Test;
|
29 | 29 | import org.mockito.ArgumentCaptor;
|
| 30 | +import org.mockito.InOrder; |
| 31 | +import reactor.core.publisher.Flux; |
30 | 32 | import reactor.core.publisher.Mono;
|
31 | 33 | import reactor.test.StepVerifier;
|
32 | 34 |
|
|
44 | 46 | import static org.mockito.ArgumentMatchers.any;
|
45 | 47 | import static org.mockito.ArgumentMatchers.anyBoolean;
|
46 | 48 | import static org.mockito.ArgumentMatchers.anyString;
|
| 49 | +import static org.mockito.BDDMockito.inOrder; |
47 | 50 | import static org.mockito.BDDMockito.mock;
|
48 | 51 | import static org.mockito.BDDMockito.never;
|
49 | 52 | import static org.mockito.BDDMockito.reset;
|
@@ -365,53 +368,110 @@ void testPropagationNeverWithExistingTransaction() {
|
365 | 368 |
|
366 | 369 | @Test
|
367 | 370 | void testPropagationNestedWithExistingTransaction() {
|
368 |
| - when(connectionMock.createSavepoint("SAVEPOINT_1")).thenReturn(Mono.empty()); |
369 |
| - when(connectionMock.releaseSavepoint("SAVEPOINT_1")).thenReturn(Mono.empty()); |
| 371 | + when(connectionMock.createSavepoint(anyString())).thenReturn(Mono.empty()); |
| 372 | + when(connectionMock.rollbackTransactionToSavepoint(anyString())).thenReturn(Mono.empty()); |
| 373 | + when(connectionMock.releaseSavepoint(anyString())).thenReturn(Mono.empty()); |
370 | 374 | when(connectionMock.commitTransaction()).thenReturn(Mono.empty());
|
371 | 375 |
|
372 | 376 | DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
|
373 | 377 | definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
|
374 | 378 |
|
375 | 379 | TransactionalOperator operator = TransactionalOperator.create(tm, definition);
|
376 |
| - operator.execute(tx1 -> { |
377 |
| - assertThat(tx1.isNewTransaction()).isTrue(); |
378 |
| - definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_NESTED); |
379 |
| - return operator.execute(tx2 -> { |
380 |
| - assertThat(tx2.isNewTransaction()).isTrue(); |
381 |
| - return Mono.empty(); |
382 |
| - }); |
383 |
| - }).as(StepVerifier::create).verifyComplete(); |
384 |
| - |
385 |
| - verify(connectionMock).createSavepoint("SAVEPOINT_1"); |
386 |
| - verify(connectionMock).releaseSavepoint("SAVEPOINT_1"); |
387 |
| - verify(connectionMock).commitTransaction(); |
388 |
| - verify(connectionMock).close(); |
389 |
| - } |
390 |
| - |
391 |
| - @Test |
392 |
| - void testPropagationNestedWithExistingTransactionAndRollback() { |
393 |
| - when(connectionMock.createSavepoint("SAVEPOINT_1")).thenReturn(Mono.empty()); |
394 |
| - when(connectionMock.rollbackTransactionToSavepoint("SAVEPOINT_1")).thenReturn(Mono.empty()); |
395 |
| - when(connectionMock.commitTransaction()).thenReturn(Mono.empty()); |
396 |
| - |
397 |
| - DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); |
398 |
| - definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); |
399 |
| - |
400 |
| - TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
401 |
| - operator.execute(tx1 -> { |
402 |
| - assertThat(tx1.isNewTransaction()).isTrue(); |
| 380 | + operator.execute(tx -> { |
| 381 | + assertThat(tx.isNewTransaction()).isTrue(); |
403 | 382 | definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_NESTED);
|
404 |
| - return operator.execute(tx2 -> { |
405 |
| - assertThat(tx2.isNewTransaction()).isTrue(); |
406 |
| - tx2.setRollbackOnly(); |
407 |
| - return Mono.empty(); |
408 |
| - }); |
| 383 | + return Flux.concat( |
| 384 | + TransactionalOperator.create(tm, definition).execute(ntx1 -> { |
| 385 | + assertThat(ntx1.isNewTransaction()).as("ntx1.isNewTransaction()").isTrue(); |
| 386 | + assertThat(ntx1.isRollbackOnly()).as("ntx1.isRollbackOnly()").isFalse(); |
| 387 | + return Mono.empty(); |
| 388 | + }), |
| 389 | + TransactionalOperator.create(tm, definition).execute(ntx2 -> { |
| 390 | + assertThat(ntx2.isNewTransaction()).as("ntx2.isNewTransaction()").isTrue(); |
| 391 | + assertThat(ntx2.isRollbackOnly()).as("ntx2.isRollbackOnly()").isFalse(); |
| 392 | + ntx2.setRollbackOnly(); |
| 393 | + assertThat(ntx2.isRollbackOnly()).isTrue(); |
| 394 | + return Mono.empty(); |
| 395 | + }), |
| 396 | + TransactionalOperator.create(tm, definition).execute(ntx3 -> { |
| 397 | + assertThat(ntx3.isNewTransaction()).as("ntx3.isNewTransaction()").isTrue(); |
| 398 | + assertThat(ntx3.isRollbackOnly()).as("ntx3.isRollbackOnly()").isFalse(); |
| 399 | + return Mono.empty(); |
| 400 | + }), |
| 401 | + TransactionalOperator.create(tm, definition).execute(ntx4 -> { |
| 402 | + assertThat(ntx4.isNewTransaction()).as("ntx4.isNewTransaction()").isTrue(); |
| 403 | + assertThat(ntx4.isRollbackOnly()).as("ntx4.isRollbackOnly()").isFalse(); |
| 404 | + ntx4.setRollbackOnly(); |
| 405 | + assertThat(ntx4.isRollbackOnly()).isTrue(); |
| 406 | + return Flux.concat( |
| 407 | + TransactionalOperator.create(tm, definition).execute(ntx4n1 -> { |
| 408 | + assertThat(ntx4n1.isNewTransaction()).as("ntx4n1.isNewTransaction()").isTrue(); |
| 409 | + assertThat(ntx4n1.isRollbackOnly()).as("ntx4n1.isRollbackOnly()").isFalse(); |
| 410 | + return Mono.empty(); |
| 411 | + }), |
| 412 | + TransactionalOperator.create(tm, definition).execute(ntx4n2 -> { |
| 413 | + assertThat(ntx4n2.isNewTransaction()).as("ntx4n2.isNewTransaction()").isTrue(); |
| 414 | + assertThat(ntx4n2.isRollbackOnly()).as("ntx4n2.isRollbackOnly()").isFalse(); |
| 415 | + ntx4n2.setRollbackOnly(); |
| 416 | + assertThat(ntx4n2.isRollbackOnly()).isTrue(); |
| 417 | + return Mono.empty(); |
| 418 | + }) |
| 419 | + ); |
| 420 | + }), |
| 421 | + TransactionalOperator.create(tm, definition).execute(ntx5 -> { |
| 422 | + assertThat(ntx5.isNewTransaction()).as("ntx5.isNewTransaction()").isTrue(); |
| 423 | + assertThat(ntx5.isRollbackOnly()).as("ntx5.isRollbackOnly()").isFalse(); |
| 424 | + ntx5.setRollbackOnly(); |
| 425 | + assertThat(ntx5.isRollbackOnly()).isTrue(); |
| 426 | + return Flux.concat( |
| 427 | + TransactionalOperator.create(tm, definition).execute(ntx5n1 -> { |
| 428 | + assertThat(ntx5n1.isNewTransaction()).as("ntx5n1.isNewTransaction()").isTrue(); |
| 429 | + assertThat(ntx5n1.isRollbackOnly()).as("ntx5n1.isRollbackOnly()").isFalse(); |
| 430 | + return Mono.empty(); |
| 431 | + }), |
| 432 | + TransactionalOperator.create(tm, definition).execute(ntx5n2 -> { |
| 433 | + assertThat(ntx5n2.isNewTransaction()).as("ntx5n2.isNewTransaction()").isTrue(); |
| 434 | + assertThat(ntx5n2.isRollbackOnly()).as("ntx5n2.isRollbackOnly()").isFalse(); |
| 435 | + ntx5n2.setRollbackOnly(); |
| 436 | + assertThat(ntx5n2.isRollbackOnly()).isTrue(); |
| 437 | + return Mono.empty(); |
| 438 | + }) |
| 439 | + ); |
| 440 | + }) |
| 441 | + ); |
409 | 442 | }).as(StepVerifier::create).verifyComplete();
|
410 | 443 |
|
411 |
| - verify(connectionMock).createSavepoint("SAVEPOINT_1"); |
412 |
| - verify(connectionMock).rollbackTransactionToSavepoint("SAVEPOINT_1"); |
413 |
| - verify(connectionMock).commitTransaction(); |
414 |
| - verify(connectionMock).close(); |
| 444 | + InOrder inOrder = inOrder(connectionMock); |
| 445 | + // ntx1 |
| 446 | + inOrder.verify(connectionMock).createSavepoint("SAVEPOINT_1"); |
| 447 | + inOrder.verify(connectionMock).releaseSavepoint("SAVEPOINT_1"); |
| 448 | + // ntx2 |
| 449 | + inOrder.verify(connectionMock).createSavepoint("SAVEPOINT_2"); |
| 450 | + inOrder.verify(connectionMock).rollbackTransactionToSavepoint("SAVEPOINT_2"); |
| 451 | + inOrder.verify(connectionMock).releaseSavepoint("SAVEPOINT_2"); |
| 452 | + // ntx3 |
| 453 | + inOrder.verify(connectionMock).createSavepoint("SAVEPOINT_3"); |
| 454 | + inOrder.verify(connectionMock).releaseSavepoint("SAVEPOINT_3"); |
| 455 | + // ntx4 |
| 456 | + inOrder.verify(connectionMock).createSavepoint("SAVEPOINT_4"); |
| 457 | + inOrder.verify(connectionMock).createSavepoint("SAVEPOINT_5"); |
| 458 | + inOrder.verify(connectionMock).releaseSavepoint("SAVEPOINT_5"); |
| 459 | + inOrder.verify(connectionMock).createSavepoint("SAVEPOINT_6"); |
| 460 | + inOrder.verify(connectionMock).rollbackTransactionToSavepoint("SAVEPOINT_6"); |
| 461 | + inOrder.verify(connectionMock).releaseSavepoint("SAVEPOINT_6"); |
| 462 | + inOrder.verify(connectionMock).releaseSavepoint("SAVEPOINT_4"); |
| 463 | + // ntx5 |
| 464 | + inOrder.verify(connectionMock).createSavepoint("SAVEPOINT_7"); |
| 465 | + inOrder.verify(connectionMock).createSavepoint("SAVEPOINT_8"); |
| 466 | + inOrder.verify(connectionMock).releaseSavepoint("SAVEPOINT_8"); |
| 467 | + inOrder.verify(connectionMock).createSavepoint("SAVEPOINT_9"); |
| 468 | + inOrder.verify(connectionMock).rollbackTransactionToSavepoint("SAVEPOINT_9"); |
| 469 | + inOrder.verify(connectionMock).releaseSavepoint("SAVEPOINT_9"); |
| 470 | + inOrder.verify(connectionMock).rollbackTransactionToSavepoint("SAVEPOINT_7"); |
| 471 | + inOrder.verify(connectionMock).releaseSavepoint("SAVEPOINT_7"); |
| 472 | + // tx |
| 473 | + inOrder.verify(connectionMock).commitTransaction(); |
| 474 | + inOrder.verify(connectionMock).close(); |
415 | 475 | }
|
416 | 476 |
|
417 | 477 | @Test
|
@@ -452,7 +512,9 @@ void testPropagationSupportsAndNestedWithRollback() {
|
452 | 512 | TransactionalOperator inner = TransactionalOperator.create(tm, innerDef);
|
453 | 513 | return inner.execute(tx2 -> {
|
454 | 514 | assertThat(tx2.isNewTransaction()).isTrue();
|
| 515 | + assertThat(tx2.isRollbackOnly()).isFalse(); |
455 | 516 | tx2.setRollbackOnly();
|
| 517 | + assertThat(tx2.isRollbackOnly()).isTrue(); |
456 | 518 | return Mono.empty();
|
457 | 519 | });
|
458 | 520 | }).as(StepVerifier::create).verifyComplete();
|
@@ -499,7 +561,9 @@ void testPropagationSupportsAndRequiresNewWithRollback() {
|
499 | 561 | TransactionalOperator inner = TransactionalOperator.create(tm, innerDef);
|
500 | 562 | return inner.execute(tx2 -> {
|
501 | 563 | assertThat(tx2.isNewTransaction()).isTrue();
|
| 564 | + assertThat(tx2.isRollbackOnly()).isFalse(); |
502 | 565 | tx2.setRollbackOnly();
|
| 566 | + assertThat(tx2.isRollbackOnly()).isTrue(); |
503 | 567 | return Mono.empty();
|
504 | 568 | });
|
505 | 569 | }).as(StepVerifier::create).verifyComplete();
|
|
0 commit comments