Skip to content

Commit ccbe1e8

Browse files
authored
BAEL-8901: mocking jdbc conn (#18378)
* BAEL-8901: mocking jdbc examples (wip) * BAEL-8901: added v2 * BAEL-8901: make methods non-static * BAEL-8901: make public * BAEL-8901: put maven plugin back * BAEL-8901: shorer name * BAEL-8901: formatting
1 parent 931a822 commit ccbe1e8

File tree

8 files changed

+241
-0
lines changed

8 files changed

+241
-0
lines changed

persistence-modules/core-java-persistence-4/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,13 @@
4747
<artifactId>spring-boot-starter</artifactId>
4848
<version>${springframework.boot.spring-boot-starter.version}</version>
4949
</dependency>
50+
51+
<dependency>
52+
<groupId>org.mockito</groupId>
53+
<artifactId>mockito-junit-jupiter</artifactId>
54+
<version>5.16.0</version>
55+
<scope>test</scope>
56+
</dependency>
5057
</dependencies>
5158

5259
<build>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.baeldung.jdbc.mocking;
2+
3+
public record Customer(int id, String name, Status status) {
4+
5+
public enum Status {
6+
ACTIVE, LOYAL, INACTIVE
7+
}
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.baeldung.jdbc.mocking;
2+
3+
import java.sql.Connection;
4+
import java.sql.ResultSet;
5+
import java.sql.SQLException;
6+
import java.sql.Statement;
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
import javax.sql.DataSource;
11+
12+
import com.baeldung.jdbc.mocking.Customer.Status;
13+
14+
public class CustomersService {
15+
16+
private final DataSource dataSource;
17+
18+
public CustomersService(DataSource dataSource) {
19+
this.dataSource = dataSource;
20+
}
21+
22+
public List<Customer> customersEligibleForOffers() throws SQLException {
23+
try (Connection conn = dataSource.getConnection(); Statement stmt = conn.createStatement()) {
24+
ResultSet resultSet = stmt.executeQuery("SELECT * FROM customers");
25+
List<Customer> customers = new ArrayList<>();
26+
27+
while (resultSet.next()) {
28+
Customer customer = mapCustomer(resultSet);
29+
if (customer.status() == Status.ACTIVE || customer.status() == Status.LOYAL) {
30+
customers.add(customer);
31+
}
32+
}
33+
return customers;
34+
}
35+
}
36+
37+
private Customer mapCustomer(ResultSet resultSet) throws SQLException {
38+
return new Customer(
39+
resultSet.getInt("id"),
40+
resultSet.getString("name"),
41+
Status.valueOf(resultSet.getString("status"))
42+
);
43+
}
44+
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.baeldung.jdbc.mocking.v2;
2+
3+
import java.sql.Connection;
4+
import java.sql.ResultSet;
5+
import java.sql.SQLException;
6+
import java.sql.Statement;
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
import java.util.function.Supplier;
10+
11+
import javax.sql.DataSource;
12+
13+
import com.baeldung.jdbc.mocking.Customer;
14+
15+
public class AllCustomers implements Supplier<List<Customer>> {
16+
17+
private final DataSource dataSource;
18+
19+
@Override
20+
public List<Customer> get() {
21+
try (Connection conn = dataSource.getConnection(); Statement stmt = conn.createStatement()) {
22+
ResultSet resultSet = stmt.executeQuery("SELECT * FROM customers");
23+
List<Customer> customers = new ArrayList<>();
24+
while (resultSet.next()) {
25+
customers.add(mapCustomer(resultSet));
26+
}
27+
return customers;
28+
} catch (SQLException e) {
29+
throw new RuntimeException(e);
30+
}
31+
}
32+
33+
public AllCustomers(DataSource dataSource) {
34+
this.dataSource = dataSource;
35+
}
36+
37+
private Customer mapCustomer(ResultSet resultSet) throws SQLException {
38+
return new Customer(resultSet.getInt("id"), resultSet.getString("name"), Customer.Status.valueOf(resultSet.getString("status")));
39+
}
40+
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.baeldung.jdbc.mocking.v2;
2+
3+
import java.util.List;
4+
import java.util.function.Supplier;
5+
6+
import com.baeldung.jdbc.mocking.Customer;
7+
import com.baeldung.jdbc.mocking.Customer.Status;
8+
9+
public class CustomersServiceV2 {
10+
11+
private final Supplier<List<Customer>> findAllCustomers;
12+
13+
public List<Customer> customersEligibleForOffers() {
14+
return findAllCustomers.get()
15+
.stream()
16+
.filter(customer -> customer.status() == Status.ACTIVE || customer.status() == Status.LOYAL)
17+
.toList();
18+
}
19+
20+
public CustomersServiceV2(Supplier<List<Customer>> findAllCustomers) {
21+
this.findAllCustomers = findAllCustomers;
22+
}
23+
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.baeldung.jdbc.mocking;
2+
3+
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
4+
5+
import java.sql.SQLException;
6+
import java.util.List;
7+
8+
import org.h2.jdbcx.JdbcDataSource;
9+
import org.junit.jupiter.api.BeforeAll;
10+
import org.junit.jupiter.api.Test;
11+
12+
import com.baeldung.jdbc.mocking.Customer.Status;
13+
14+
class JdbcMockingIntegrationTest {
15+
16+
private static JdbcDataSource dataSource;
17+
18+
@BeforeAll
19+
static void setUp() {
20+
dataSource = new JdbcDataSource();
21+
dataSource.setURL("jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM 'classpath:data.sql'");
22+
dataSource.setUser("sa");
23+
dataSource.setPassword("");
24+
}
25+
26+
@Test
27+
void whenFetchingCustomersEligibleForOffers_thenTheyHaveActiveOrLoyalStatus() throws SQLException {
28+
CustomersService customersService = new CustomersService(dataSource);
29+
30+
List<Customer> customers = customersService.customersEligibleForOffers();
31+
32+
assertThat(customers).extracting(Customer::status)
33+
.containsOnly(Status.ACTIVE, Status.LOYAL);
34+
}
35+
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.baeldung.jdbc.mocking;
2+
3+
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
4+
import static org.mockito.Mockito.when;
5+
6+
import java.sql.Connection;
7+
import java.sql.ResultSet;
8+
import java.sql.Statement;
9+
import java.util.List;
10+
11+
import javax.sql.DataSource;
12+
13+
import org.junit.jupiter.api.Test;
14+
import org.junit.jupiter.api.extension.ExtendWith;
15+
import org.mockito.Mock;
16+
import org.mockito.junit.jupiter.MockitoExtension;
17+
18+
import com.baeldung.jdbc.mocking.Customer.Status;
19+
import com.baeldung.jdbc.mocking.v2.CustomersServiceV2;
20+
21+
@ExtendWith(MockitoExtension.class)
22+
class JdbcMockingUnitTest {
23+
24+
@Mock
25+
DataSource dataSource;
26+
@Mock
27+
Connection conn;
28+
@Mock
29+
Statement stmt;
30+
@Mock
31+
ResultSet resultSet;
32+
33+
@Test
34+
void whenFetchingEligibleCustomers_thenTheyHaveCorrectStatus() throws Exception {
35+
//given
36+
CustomersService customersService = new CustomersService(dataSource);
37+
38+
when(dataSource.getConnection())
39+
.thenReturn(conn);
40+
when(conn.createStatement())
41+
.thenReturn(stmt);
42+
when(stmt.executeQuery("SELECT * FROM customers"))
43+
.thenReturn(resultSet);
44+
45+
when(resultSet.next())
46+
.thenReturn(true, true, true, false);
47+
when(resultSet.getInt("id"))
48+
.thenReturn(1, 2, 3);
49+
when(resultSet.getString("name"))
50+
.thenReturn("Alice", "Bob", "John");
51+
when(resultSet.getString("status"))
52+
.thenReturn("LOYAL", "ACTIVE", "INACTIVE");
53+
54+
// when
55+
List<Customer> eligibleCustomers = customersService.customersEligibleForOffers();
56+
57+
// then
58+
assertThat(eligibleCustomers).containsExactlyInAnyOrder(new Customer(1, "Alice", Status.LOYAL), new Customer(2, "Bob", Status.ACTIVE));
59+
}
60+
61+
@Test
62+
void whenFetchingEligibleCustomersFromV2_thenTheyHaveCorrectStatus() {
63+
// given
64+
List<Customer> allCustomers = List.of(new Customer(1, "Alice", Status.LOYAL), new Customer(2, "Bob", Status.ACTIVE),
65+
new Customer(3, "John", Status.INACTIVE));
66+
67+
CustomersServiceV2 service = new CustomersServiceV2(() -> allCustomers);
68+
69+
// when
70+
List<Customer> eligibleCustomers = service.customersEligibleForOffers();
71+
72+
// then
73+
assertThat(eligibleCustomers).containsExactlyInAnyOrder(new Customer(1, "Alice", Status.LOYAL), new Customer(2, "Bob", Status.ACTIVE));
74+
}
75+
76+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
create table customers (id int primary key, name varchar(255), status varchar(255));
2+
insert into customers (id, name, status) values (1, 'Alice', 'LOYAL');
3+
insert into customers (id, name, status) values (2, 'Bob', 'ACTIVE');
4+
insert into customers (id, name, status) values (3, 'Charlie', 'INACTIVE');

0 commit comments

Comments
 (0)