Skip to content

Commit 669b656

Browse files
committed
Improve tests & thread-safety
1 parent 82f6a9a commit 669b656

File tree

8 files changed

+296
-82
lines changed

8 files changed

+296
-82
lines changed

.idea/uiDesigner.xml

Lines changed: 124 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/java/com/lemick/assertions/HibernateStatementAssertUtils.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,23 @@
77

88
public class HibernateStatementAssertUtils {
99

10-
public static HibernateStatementAssertionResult assertInsertStatementCount(int expectedInsertStatementCount) {
11-
return new HibernateStatementAssertionResult(SELECT, HibernateStatementCountInspector.getInsertStatementCount(), expectedInsertStatementCount);
10+
public HibernateStatementAssertionResult assertInsertStatementCount(int expectedInsertStatementCount) {
11+
return new HibernateStatementAssertionResult(INSERT, HibernateStatementCountInspector.getStatistics().getInsertStatementCount(), expectedInsertStatementCount);
1212
}
1313

14-
public static HibernateStatementAssertionResult assertUpdateStatementCount(int expectedUpdateStatementCount) {
15-
return new HibernateStatementAssertionResult(UPDATE, HibernateStatementCountInspector.getUpdateStatementCount(), expectedUpdateStatementCount);
14+
public HibernateStatementAssertionResult assertUpdateStatementCount(int expectedUpdateStatementCount) {
15+
return new HibernateStatementAssertionResult(UPDATE, HibernateStatementCountInspector.getStatistics().getUpdateStatementCount(), expectedUpdateStatementCount);
1616
}
1717

18-
public static HibernateStatementAssertionResult assertSelectStatementCount(int expectedSelectStatementCount) {
19-
return new HibernateStatementAssertionResult(SELECT, HibernateStatementCountInspector.getSelectStatementCount(), expectedSelectStatementCount);
18+
public HibernateStatementAssertionResult assertSelectStatementCount(int expectedSelectStatementCount) {
19+
return new HibernateStatementAssertionResult(SELECT, HibernateStatementCountInspector.getStatistics().getSelectStatementCount(), expectedSelectStatementCount);
2020
}
2121

22-
public static HibernateStatementAssertionResult assertDeleteStatementCount(int expectedDeleteStatementCount) {
23-
return new HibernateStatementAssertionResult(DELETE, HibernateStatementCountInspector.getDeleteStatementCount(), expectedDeleteStatementCount);
22+
public HibernateStatementAssertionResult assertDeleteStatementCount(int expectedDeleteStatementCount) {
23+
return new HibernateStatementAssertionResult(DELETE, HibernateStatementCountInspector.getStatistics().getDeleteStatementCount(), expectedDeleteStatementCount);
24+
}
25+
26+
public void resetCounts() {
27+
HibernateStatementCountInspector.resetStatistics();
2428
}
2529
}

src/main/java/com/lemick/integration/hibernate/HibernateStatementCountInspector.java

Lines changed: 8 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,61 +2,25 @@
22

33
import org.hibernate.resource.jdbc.spi.StatementInspector;
44

5-
public class HibernateStatementCountInspector implements StatementInspector, HibernateStatementCountListener {
5+
public class HibernateStatementCountInspector implements StatementInspector {
66

7-
private static int selectStatementCount = 0;
8-
private static int updateStatementCount = 0;
9-
private static int insertStatementCount = 0;
10-
private static int deleteStatementCount = 0;
7+
private static final ThreadLocal<HibernateStatistics> statisticsStore = ThreadLocal.withInitial(HibernateStatistics::new);
118

129
private HibernateStatementParser statementParser = new JSQLHibernateStatementParser();
1310

1411
@Override
1512
public String inspect(String sql) {
16-
statementParser.parseSqlStatement(sql, this);
13+
statementParser.parseSqlStatement(sql, statisticsStore.get());
1714
return sql;
1815
}
1916

20-
@Override
21-
public void notifySelectStatement() {
22-
selectStatementCount++;
17+
public static void resetStatistics() {
18+
statisticsStore.remove();
19+
statisticsStore.set(new HibernateStatistics());
2320
}
2421

25-
@Override
26-
public void notifyUpdateStatement() {
27-
updateStatementCount++;
28-
}
29-
30-
@Override
31-
public void notifyInsertStatement() {
32-
insertStatementCount++;
22+
public static HibernateStatistics getStatistics() {
23+
return statisticsStore.get();
3324
}
3425

35-
@Override
36-
public void notifyDeleteStatement() {
37-
deleteStatementCount++;
38-
}
39-
40-
public static void resetCounts() {
41-
selectStatementCount = 0;
42-
updateStatementCount = 0;
43-
insertStatementCount = 0;
44-
deleteStatementCount = 0;
45-
}
46-
47-
public static int getSelectStatementCount() {
48-
return selectStatementCount;
49-
}
50-
51-
public static int getUpdateStatementCount() {
52-
return updateStatementCount;
53-
}
54-
55-
public static int getInsertStatementCount() {
56-
return insertStatementCount;
57-
}
58-
59-
public static int getDeleteStatementCount() {
60-
return deleteStatementCount;
61-
}
6226
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.lemick.integration.hibernate;
2+
3+
public class HibernateStatistics implements HibernateStatementCountListener{
4+
5+
private int selectStatementCount = 0;
6+
private int updateStatementCount = 0;
7+
private int insertStatementCount = 0;
8+
private int deleteStatementCount = 0;
9+
10+
@Override
11+
public void notifySelectStatement() {
12+
selectStatementCount++;
13+
}
14+
15+
@Override
16+
public void notifyUpdateStatement() {
17+
updateStatementCount++;
18+
}
19+
20+
@Override
21+
public void notifyInsertStatement() {
22+
insertStatementCount++;
23+
}
24+
25+
@Override
26+
public void notifyDeleteStatement() {
27+
deleteStatementCount++;
28+
}
29+
30+
public int getSelectStatementCount() {
31+
return selectStatementCount;
32+
}
33+
34+
public int getUpdateStatementCount() {
35+
return updateStatementCount;
36+
}
37+
38+
public int getInsertStatementCount() {
39+
return insertStatementCount;
40+
}
41+
42+
public int getDeleteStatementCount() {
43+
return deleteStatementCount;
44+
}
45+
}

src/main/java/com/lemick/integration/spring/HibernateStatementCountTestListener.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,27 @@
44
import com.lemick.api.AssertSQLStatementCount;
55
import com.lemick.assertions.HibernateStatementAssertUtils;
66
import com.lemick.assertions.HibernateStatementAssertionResults;
7-
import com.lemick.integration.hibernate.HibernateStatementCountInspector;
87
import org.springframework.core.Ordered;
98
import org.springframework.test.context.TestContext;
109
import org.springframework.test.context.TestExecutionListener;
1110

1211
import java.util.List;
1312

13+
/**
14+
* TODO
15+
* Permettre les asserts dans le test
16+
* Augmenter les type d'assert (mise en cache, etc...)
17+
* Classe Thread-safe
18+
*/
1419
public class HibernateStatementCountTestListener implements TestExecutionListener, Ordered {
1520

21+
private HibernateStatementAssertUtils hibernateStatementAssertUtils = new HibernateStatementAssertUtils();
22+
1623
@Override
1724
public void beforeTestMethod(TestContext testContext) {
1825
AssertSQLStatementCount annotation = testContext.getTestMethod().getAnnotation(AssertSQLStatementCount.class);
1926
if (annotation != null) {
20-
HibernateStatementCountInspector.resetCounts();
27+
hibernateStatementAssertUtils.resetCounts();
2128
}
2229
}
2330

@@ -26,10 +33,10 @@ public void afterTestMethod(TestContext testContext) {
2633
AssertSQLStatementCount annotation = testContext.getTestMethod().getAnnotation(AssertSQLStatementCount.class);
2734
if (annotation != null) {
2835
HibernateStatementAssertionResults assertionResults = new HibernateStatementAssertionResults(List.of(
29-
HibernateStatementAssertUtils.assertSelectStatementCount(annotation.selects()),
30-
HibernateStatementAssertUtils.assertUpdateStatementCount(annotation.updates()),
31-
HibernateStatementAssertUtils.assertInsertStatementCount(annotation.inserts()),
32-
HibernateStatementAssertUtils.assertDeleteStatementCount(annotation.deletes())
36+
hibernateStatementAssertUtils.assertSelectStatementCount(annotation.selects()),
37+
hibernateStatementAssertUtils.assertUpdateStatementCount(annotation.updates()),
38+
hibernateStatementAssertUtils.assertInsertStatementCount(annotation.inserts()),
39+
hibernateStatementAssertUtils.assertDeleteStatementCount(annotation.deletes())
3340
));
3441
assertionResults.validate();
3542
}

src/test/java/com/lemick/integration/hibernate/HibernateStatementCountInspectorTest.java

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77
import org.mockito.junit.jupiter.MockitoExtension;
88

99
import static org.junit.jupiter.api.Assertions.*;
10-
import static org.mockito.Mockito.description;
11-
import static org.mockito.Mockito.verify;
10+
import static org.mockito.Mockito.*;
1211

1312
@ExtendWith(MockitoExtension.class)
1413
class HibernateStatementCountInspectorTest {
@@ -24,26 +23,15 @@ public void _inspect() {
2423
String actual = model.inspect("SELECT * FROM Post");
2524

2625
assertEquals("SELECT * FROM Post", actual, "output is the same as the input");
27-
verify(statementParser, description("parser is called")).parseSqlStatement("SELECT * FROM Post", model);
26+
verify(statementParser, description("parser is called")).parseSqlStatement("SELECT * FROM Post", HibernateStatementCountInspector.getStatistics());
2827
}
2928

3029
@Test
31-
public void _notify_increments() {
32-
model.notifySelectStatement();
33-
model.notifyInsertStatement();
34-
model.notifyUpdateStatement();
35-
model.notifyDeleteStatement();
36-
37-
assertEquals(1, HibernateStatementCountInspector.getSelectStatementCount(), "the count is incremented");
38-
assertEquals(1, HibernateStatementCountInspector.getInsertStatementCount(), "the count is incremented");
39-
assertEquals(1, HibernateStatementCountInspector.getUpdateStatementCount(), "the count is incremented");
40-
assertEquals(1, HibernateStatementCountInspector.getDeleteStatementCount(), "the count is incremented");
41-
42-
HibernateStatementCountInspector.resetCounts();
43-
44-
assertEquals(0, HibernateStatementCountInspector.getSelectStatementCount(), "the count is reset");
45-
assertEquals(0, HibernateStatementCountInspector.getInsertStatementCount(), "the count is reset");
46-
assertEquals(0, HibernateStatementCountInspector.getUpdateStatementCount(), "the count is reset");
47-
assertEquals(0, HibernateStatementCountInspector.getDeleteStatementCount(), "the count is reset");
30+
public void _resetStatistics() {
31+
HibernateStatistics beforeStatistics = HibernateStatementCountInspector.getStatistics();
32+
33+
HibernateStatementCountInspector.resetStatistics();
34+
35+
assertNotSame(beforeStatistics, HibernateStatementCountInspector.getStatistics(), "the statistics has been recreated");
4836
}
4937
}

0 commit comments

Comments
 (0)