|
53 | 53 | import static org.mockito.Mockito.mock;
|
54 | 54 | import static org.mockito.Mockito.times;
|
55 | 55 | import static org.mockito.Mockito.verify;
|
| 56 | +import static org.mockito.Mockito.verifyNoInteractions; |
56 | 57 |
|
57 | 58 | /**
|
58 | 59 | * @author Rick Evans
|
@@ -580,4 +581,104 @@ void testBatchUpdateWithSqlParameterSourcePlusTypeInfo() throws Exception {
|
580 | 581 | verify(connection, atLeastOnce()).close();
|
581 | 582 | }
|
582 | 583 |
|
| 584 | + |
| 585 | + @Test |
| 586 | + void testMultipleBatchUpdateWithSqlParameterSource() throws Exception { |
| 587 | + List<SqlParameterSource> ids = List.of( |
| 588 | + new MapSqlParameterSource("id", 100), |
| 589 | + new MapSqlParameterSource("id", 200), |
| 590 | + new MapSqlParameterSource("id", 300), |
| 591 | + new MapSqlParameterSource("id", 400), |
| 592 | + new MapSqlParameterSource("id", 500) |
| 593 | + ); |
| 594 | + |
| 595 | + int[] rowsAffected1 = new int[]{1, 2}; |
| 596 | + int[] rowsAffected2 = new int[]{3, 4}; |
| 597 | + int[] rowsAffected3 = new int[]{5}; |
| 598 | + |
| 599 | + given(preparedStatement.executeBatch()).willReturn(rowsAffected1, rowsAffected2, rowsAffected3); |
| 600 | + given(connection.getMetaData()).willReturn(databaseMetaData); |
| 601 | + |
| 602 | + namedParameterTemplate = new NamedParameterJdbcTemplate(new JdbcTemplate(dataSource, false)); |
| 603 | + |
| 604 | + int batchSize = 2; |
| 605 | + |
| 606 | + int[][] actualRowsAffected = namedParameterTemplate.batchUpdate( |
| 607 | + "UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = :id", ids, batchSize); |
| 608 | + |
| 609 | + assertThat(actualRowsAffected.length).as("executed 3 batches").isEqualTo(3); |
| 610 | + assertThat(actualRowsAffected[0]).isEqualTo(rowsAffected1); |
| 611 | + assertThat(actualRowsAffected[1]).isEqualTo(rowsAffected2); |
| 612 | + assertThat(actualRowsAffected[2]).isEqualTo(rowsAffected3); |
| 613 | + |
| 614 | + verify(preparedStatement, times(5)).addBatch(); |
| 615 | + verify(connection, times(1)).prepareStatement("UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = ?"); |
| 616 | + verify(preparedStatement).setObject(1, 100); |
| 617 | + verify(preparedStatement).setObject(1, 200); |
| 618 | + verify(preparedStatement).setObject(1, 300); |
| 619 | + verify(preparedStatement).setObject(1, 400); |
| 620 | + verify(preparedStatement).setObject(1, 500); |
| 621 | + verify(preparedStatement, atLeastOnce()).close(); |
| 622 | + verify(connection, atLeastOnce()).close(); |
| 623 | + } |
| 624 | + |
| 625 | + @Test |
| 626 | + void testMultipleBatchUpdateWithEmptySqlParameterSourceArg() { |
| 627 | + namedParameterTemplate = new NamedParameterJdbcTemplate(new JdbcTemplate(dataSource, false)); |
| 628 | + |
| 629 | + int batchSize = 2; |
| 630 | + |
| 631 | + int[][] actualRowsAffected = namedParameterTemplate.batchUpdate( |
| 632 | + "UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = :id", Collections.emptyList(), batchSize); |
| 633 | + |
| 634 | + assertThat(actualRowsAffected.length).as("executed 0 batches").isZero(); |
| 635 | + verifyNoInteractions(preparedStatement); |
| 636 | + verifyNoInteractions(connection); |
| 637 | + } |
| 638 | + |
| 639 | + @Test |
| 640 | + void testMultipleBatchUpdateWithSqlParameterSourceWithZeroBatchSize() { |
| 641 | + namedParameterTemplate = new NamedParameterJdbcTemplate(new JdbcTemplate(dataSource, false)); |
| 642 | + |
| 643 | + int batchSize = 0; |
| 644 | + |
| 645 | + int[][] actualRowsAffected = namedParameterTemplate.batchUpdate( |
| 646 | + "UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = :id", |
| 647 | + List.of(new MapSqlParameterSource("id", 100)), |
| 648 | + batchSize); |
| 649 | + |
| 650 | + assertThat(actualRowsAffected.length).as("executed 0 batches").isZero(); |
| 651 | + verifyNoInteractions(preparedStatement); |
| 652 | + verifyNoInteractions(connection); |
| 653 | + } |
| 654 | + |
| 655 | + @Test |
| 656 | + void testMultipleBatchUpdateWithSqlParameterSourceSmallerThanBatchSize() throws Exception { |
| 657 | + List<SqlParameterSource> ids = List.of( |
| 658 | + new MapSqlParameterSource("id", 100), |
| 659 | + new MapSqlParameterSource("id", 200) |
| 660 | + ); |
| 661 | + |
| 662 | + int[] rowsAffected = new int[]{1, 2}; |
| 663 | + |
| 664 | + given(preparedStatement.executeBatch()).willReturn(rowsAffected); |
| 665 | + given(connection.getMetaData()).willReturn(databaseMetaData); |
| 666 | + |
| 667 | + namedParameterTemplate = new NamedParameterJdbcTemplate(new JdbcTemplate(dataSource, false)); |
| 668 | + |
| 669 | + int batchSize = 3; |
| 670 | + |
| 671 | + int[][] actualRowsAffected = namedParameterTemplate.batchUpdate( |
| 672 | + "UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = :id", ids, batchSize); |
| 673 | + |
| 674 | + assertThat(actualRowsAffected.length).as("executed 1 batch").isEqualTo(1); |
| 675 | + assertThat(actualRowsAffected[0]).isEqualTo(rowsAffected); |
| 676 | + |
| 677 | + verify(preparedStatement, times(2)).addBatch(); |
| 678 | + verify(connection, times(1)).prepareStatement("UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = ?"); |
| 679 | + verify(preparedStatement).setObject(1, 100); |
| 680 | + verify(preparedStatement).setObject(1, 200); |
| 681 | + verify(preparedStatement, atLeastOnce()).close(); |
| 682 | + verify(connection, atLeastOnce()).close(); |
| 683 | + } |
583 | 684 | }
|
0 commit comments