diff --git a/modules/spring-session-ext/src/main/java/org/apache/ignite/spring/sessions/EnableIgniteHttpSession.java b/modules/spring-session-ext/src/main/java/org/apache/ignite/spring/sessions/EnableIgniteHttpSession.java
index b49dd33..e023ef7 100644
--- a/modules/spring-session-ext/src/main/java/org/apache/ignite/spring/sessions/EnableIgniteHttpSession.java
+++ b/modules/spring-session-ext/src/main/java/org/apache/ignite/spring/sessions/EnableIgniteHttpSession.java
@@ -61,7 +61,6 @@
 @Import(IgniteHttpSessionConfiguration.class)
 @Configuration(proxyBeanMethods = false)
 public @interface EnableIgniteHttpSession {
-
     /**
      * The session timeout in seconds. By default, it is set to 1800 seconds (30 minutes).
      * This should be a non-negative integer.
diff --git a/modules/spring-session-ext/src/main/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfiguration.java b/modules/spring-session-ext/src/main/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfiguration.java
index 8c31464..38fd1c7 100644
--- a/modules/spring-session-ext/src/main/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfiguration.java
+++ b/modules/spring-session-ext/src/main/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfiguration.java
@@ -48,7 +48,6 @@
  */
 @Configuration(proxyBeanMethods = false)
 public class IgniteHttpSessionConfiguration extends SpringHttpSessionConfiguration implements ImportAware {
-
     /** */
     private Integer maxInactiveIntervalInSeconds = MapSession.DEFAULT_MAX_INACTIVE_INTERVAL_SECONDS;
 
diff --git a/modules/spring-session-ext/src/main/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepository.java b/modules/spring-session-ext/src/main/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepository.java
index 155d978..2c736dd 100644
--- a/modules/spring-session-ext/src/main/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepository.java
+++ b/modules/spring-session-ext/src/main/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepository.java
@@ -103,7 +103,6 @@
         CacheEntryCreatedListener<String, IgniteIndexedSessionRepository.IgniteSession>,
         CacheEntryRemovedListener<String, IgniteIndexedSessionRepository.IgniteSession>,
         CacheEntryExpiredListener<String, IgniteIndexedSessionRepository.IgniteSession> {
-
     /**
      * The default name of map used by Spring Session to store sessions.
      */
diff --git a/modules/spring-session-ext/src/main/java/org/apache/ignite/spring/sessions/SpringSessionIgnite.java b/modules/spring-session-ext/src/main/java/org/apache/ignite/spring/sessions/SpringSessionIgnite.java
index 3db23fc..a604dc0 100644
--- a/modules/spring-session-ext/src/main/java/org/apache/ignite/spring/sessions/SpringSessionIgnite.java
+++ b/modules/spring-session-ext/src/main/java/org/apache/ignite/spring/sessions/SpringSessionIgnite.java
@@ -36,6 +36,5 @@
 @Documented
 @Qualifier
 public @interface SpringSessionIgnite {
-
 }
 
diff --git a/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/AbstractIgniteIndexedSessionRepositoryITests.java b/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/AbstractIgniteIndexedSessionRepositoryITest.java
similarity index 97%
rename from modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/AbstractIgniteIndexedSessionRepositoryITests.java
rename to modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/AbstractIgniteIndexedSessionRepositoryITest.java
index 8277716..8a0e3a4 100644
--- a/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/AbstractIgniteIndexedSessionRepositoryITests.java
+++ b/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/AbstractIgniteIndexedSessionRepositoryITest.java
@@ -38,16 +38,19 @@
 /**
  * Base class for {@link IgniteIndexedSessionRepository} integration tests.
  */
-abstract class AbstractIgniteIndexedSessionRepositoryITests {
-
+abstract class AbstractIgniteIndexedSessionRepositoryITest {
+    /** */
     private static final String SPRING_SECURITY_CONTEXT = "SPRING_SECURITY_CONTEXT";
 
+    /** */
     @Autowired
     private Ignite ignite;
 
+    /** */
     @Autowired
     private IgniteIndexedSessionRepository repository;
 
+    /** */
     @Test
     void createAndDestroySession() {
         IgniteIndexedSessionRepository.IgniteSession sessionToSave = this.repository.createSession();
@@ -68,6 +71,7 @@
         assertThat(cache.size()).isEqualTo(0);
     }
 
+    /** */
     @Test
     void changeSessionIdWhenOnlyChangeId() {
         String attrName = "changeSessionId";
@@ -95,6 +99,7 @@
         this.repository.deleteById(changeSessionId);
     }
 
+    /** */
     @Test
     void changeSessionIdWhenChangeTwice() {
         IgniteSession toSave = this.repository.createSession();
@@ -114,6 +119,7 @@
         this.repository.deleteById(changeId2);
     }
 
+    /** */
     @Test
     void changeSessionIdWhenSetAttributeOnChangedSession() {
         String attrName = "changeSessionId";
@@ -141,6 +147,7 @@
         this.repository.deleteById(changeSessionId);
     }
 
+    /** */
     @Test
     void changeSessionIdWhenHasNotSaved() {
         IgniteSession toSave = this.repository.createSession();
@@ -168,6 +175,7 @@
         assertThat(this.repository.findById(sessionId)).isNull();
     }
 
+    /** */
     @Test
     void expireSession() {
         IgniteSession session = this.repository.createSession();
@@ -179,6 +187,7 @@
         assertThat(this.repository.findById(sessionId)).isNull();
     }
 
+    /** */
     @Test
     void createAndUpdateSession() {
         IgniteSession session = this.repository.createSession();
@@ -194,6 +203,7 @@
         assertThat(this.repository.findById(sessionId)).isNotNull();
     }
 
+    /** */
     @Test
     void createSessionWithSecurityContextAndFindById() {
         IgniteSession session = this.repository.createSession();
@@ -210,6 +220,7 @@
         assertThat(this.repository.findById(sessionId)).isNotNull();
     }
 
+    /** */
     @Test
     void createSessionWithSecurityContextAndFindByPrincipal() {
         IgniteSession session = this.repository.createSession();
diff --git a/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/EmbeddedIgniteIndexedSessionRepositoryITests.java b/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/EmbeddedIgniteIndexedSessionRepositoryITest.java
similarity index 91%
rename from modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/EmbeddedIgniteIndexedSessionRepositoryITests.java
rename to modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/EmbeddedIgniteIndexedSessionRepositoryITest.java
index d11ae54..e40fc72 100644
--- a/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/EmbeddedIgniteIndexedSessionRepositoryITests.java
+++ b/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/EmbeddedIgniteIndexedSessionRepositoryITest.java
@@ -35,22 +35,26 @@
 @ExtendWith(SpringExtension.class)
 @ContextConfiguration
 @WebAppConfiguration
-class EmbeddedIgniteIndexedSessionRepositoryITests extends AbstractIgniteIndexedSessionRepositoryITests {
-
+public
+class EmbeddedIgniteIndexedSessionRepositoryITest extends AbstractIgniteIndexedSessionRepositoryITest {
+    /** */
     @BeforeAll
     static void setUpClass() {
         Ignition.stopAll(true);
     }
 
+    /** */
     @AfterAll
     static void tearDownClass() {
         Ignition.stopAll(true);
     }
 
+    /** */
     @EnableIgniteHttpSession
     @Configuration
     static class IgniteSessionConfig {
 
+        /** */
         @Bean
         Ignite ignite() {
             return IgniteITestUtils.embeddedIgniteServer();
diff --git a/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfigurationTests.java b/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfigurationTest.java
similarity index 95%
rename from modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfigurationTests.java
rename to modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfigurationTest.java
index cdffcd6..0230081 100644
--- a/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfigurationTests.java
+++ b/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfigurationTest.java
@@ -45,26 +45,31 @@
 /**
  * Tests for {@link IgniteHttpSessionConfiguration}.
  */
-class IgniteHttpSessionConfigurationTests {
-
+public class IgniteHttpSessionConfigurationTest {
+    /** */
     private static final String MAP_NAME = "spring:test:sessions";
 
+    /** */
     private static final int MAX_INACTIVE_INTERVAL_IN_SECONDS = 600;
 
+    /** */
     private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
 
+    /** */
     @AfterEach
     void closeContext() {
         if (this.context != null)
             this.context.close();
     }
 
+    /** */
     @Test
     void noIgniteConfiguration() {
         assertThatExceptionOfType(BeanCreationException.class)
                 .isThrownBy(() -> registerAndRefresh(NoIgniteConfiguration.class)).withMessageContaining("Ignite");
     }
 
+    /** */
     @Test
     void defaultConfiguration() {
         registerAndRefresh(DefaultConfiguration.class);
@@ -72,6 +77,7 @@
         assertThat(this.context.getBean(IgniteIndexedSessionRepository.class)).isNotNull();
     }
 
+    /** */
     @Test
     void customTableName() {
         registerAndRefresh(CustomSessionMapNameConfiguration.class);
@@ -82,6 +88,7 @@
         assertThat(ReflectionTestUtils.getField(configuration, "sessionMapName")).isEqualTo(MAP_NAME);
     }
 
+    /** */
     @Test
     void setCustomSessionMapName() {
         registerAndRefresh(BaseConfiguration.class, CustomSessionMapNameSetConfiguration.class);
@@ -92,6 +99,7 @@
         assertThat(ReflectionTestUtils.getField(configuration, "sessionMapName")).isEqualTo(MAP_NAME);
     }
 
+    /** */
     @Test
     void setCustomMaxInactiveIntervalInSeconds() {
         registerAndRefresh(BaseConfiguration.class, CustomMaxInactiveIntervalInSecondsSetConfiguration.class);
@@ -102,6 +110,7 @@
                 .isEqualTo(MAX_INACTIVE_INTERVAL_IN_SECONDS);
     }
 
+    /** */
     @Test
     void customMaxInactiveIntervalInSeconds() {
         registerAndRefresh(CustomMaxInactiveIntervalInSecondsConfiguration.class);
@@ -112,6 +121,7 @@
                 .isEqualTo(MAX_INACTIVE_INTERVAL_IN_SECONDS);
     }
 
+    /** */
     @Test
     void customFlushImmediately() {
         registerAndRefresh(CustomFlushImmediatelyConfiguration.class);
@@ -121,6 +131,7 @@
         assertThat(ReflectionTestUtils.getField(repository, "flushMode")).isEqualTo(FlushMode.IMMEDIATE);
     }
 
+    /** */
     @Test
     void setCustomFlushImmediately() {
         registerAndRefresh(BaseConfiguration.class, CustomFlushImmediatelySetConfiguration.class);
@@ -130,6 +141,7 @@
         assertThat(ReflectionTestUtils.getField(repository, "flushMode")).isEqualTo(FlushMode.IMMEDIATE);
     }
 
+    /** */
     @Test
     void customSaveModeAnnotation() {
         registerAndRefresh(BaseConfiguration.class, CustomSaveModeExpressionAnnotationConfiguration.class);
@@ -137,6 +149,7 @@
                 SaveMode.ALWAYS);
     }
 
+    /** */
     @Test
     void customSaveModeSetter() {
         registerAndRefresh(BaseConfiguration.class, CustomSaveModeExpressionSetterConfiguration.class);
@@ -144,6 +157,7 @@
                 SaveMode.ALWAYS);
     }
 
+    /** */
     @Test
     void qualifiedIgniteConfiguration() {
         registerAndRefresh(QualifiedIgniteConfiguration.class);
@@ -156,6 +170,7 @@
                 .isEqualTo(QualifiedIgniteConfiguration.qualifiedIgniteSessions);
     }
 
+    /** */
     @Test
     void primaryIgniteConfiguration() {
         registerAndRefresh(PrimaryIgniteConfiguration.class);
@@ -168,6 +183,7 @@
                 .isEqualTo(PrimaryIgniteConfiguration.primaryIgniteSessions);
     }
 
+    /** */
     @Test
     void qualifiedAndPrimaryIgniteConfiguration() {
         registerAndRefresh(QualifiedAndPrimaryIgniteConfiguration.class);
@@ -180,6 +196,7 @@
                 .isEqualTo(QualifiedAndPrimaryIgniteConfiguration.qualifiedIgniteSessions);
     }
 
+    /** */
     @Test
     void namedIgniteConfiguration() {
         registerAndRefresh(NamedIgniteConfiguration.class);
@@ -192,6 +209,7 @@
                 .isEqualTo(NamedIgniteConfiguration.igniteSessions);
     }
 
+    /** */
     @Test
     void multipleIgniteConfiguration() {
         assertThatExceptionOfType(BeanCreationException.class)
@@ -199,6 +217,7 @@
                 .withMessageContaining("expected single matching bean but found 2");
     }
 
+    /** */
     @Test
     void customIndexResolverConfiguration() {
         registerAndRefresh(CustomIndexResolverConfiguration.class);
@@ -210,6 +229,7 @@
         assertThat(repository).hasFieldOrPropertyWithValue("indexResolver", indexResolver);
     }
 
+    /** */
     @Test
     void sessionRepositoryCustomizer() {
         registerAndRefresh(SessionRepositoryCustomizerConfiguration.class);
@@ -218,22 +238,27 @@
                 MAX_INACTIVE_INTERVAL_IN_SECONDS);
     }
 
+    /** */
     private void registerAndRefresh(Class<?>... annotatedClasses) {
         this.context.register(annotatedClasses);
         this.context.refresh();
     }
 
+    /** */
     @Configuration
     @EnableIgniteHttpSession
     static class NoIgniteConfiguration {
 
     }
 
+    /** */
     static class BaseConfiguration {
 
+        /** */
         @SuppressWarnings("unchecked")
         static IgniteCache<Object, Object> defaultIgniteSessions = mock(IgniteCache.class);
 
+        /** */
         @Bean
         Ignite defaultIgnite() {
             Ignite ignite = mock(Ignite.class);
@@ -244,18 +269,21 @@
 
     }
 
+    /** */
     @Configuration
     @EnableIgniteHttpSession
     static class DefaultConfiguration extends BaseConfiguration {
 
     }
 
+    /** */
     @Configuration
     @EnableIgniteHttpSession(sessionMapName = MAP_NAME)
     static class CustomSessionMapNameConfiguration extends BaseConfiguration {
 
     }
 
+    /** */
     @Configuration
     static class CustomSessionMapNameSetConfiguration extends IgniteHttpSessionConfiguration {
 
@@ -265,6 +293,7 @@
 
     }
 
+    /** */
     @Configuration
     static class CustomMaxInactiveIntervalInSecondsSetConfiguration extends IgniteHttpSessionConfiguration {
 
@@ -274,12 +303,14 @@
 
     }
 
+    /** */
     @Configuration
     @EnableIgniteHttpSession(maxInactiveIntervalInSeconds = MAX_INACTIVE_INTERVAL_IN_SECONDS)
     static class CustomMaxInactiveIntervalInSecondsConfiguration extends BaseConfiguration {
 
     }
 
+    /** */
     @Configuration
     static class CustomFlushImmediatelySetConfiguration extends IgniteHttpSessionConfiguration {
 
@@ -289,11 +320,13 @@
 
     }
 
+    /** */
     @EnableIgniteHttpSession(saveMode = SaveMode.ALWAYS)
     static class CustomSaveModeExpressionAnnotationConfiguration {
 
     }
 
+    /** */
     @Configuration
     static class CustomSaveModeExpressionSetterConfiguration extends IgniteHttpSessionConfiguration {
 
@@ -303,19 +336,23 @@
 
     }
 
+    /** */
     @Configuration
     @EnableIgniteHttpSession(flushMode = FlushMode.IMMEDIATE)
     static class CustomFlushImmediatelyConfiguration extends BaseConfiguration {
 
     }
 
+    /** */
     @Configuration
     @EnableIgniteHttpSession
     static class QualifiedIgniteConfiguration extends BaseConfiguration {
 
+        /** */
         @SuppressWarnings("unchecked")
         static IgniteCache<Object, Object> qualifiedIgniteSessions = mock(IgniteCache.class);
 
+        /** */
         @Bean
         @SpringSessionIgnite
         Ignite qualifiedIgnite() {
@@ -327,13 +364,16 @@
 
     }
 
+    /** */
     @Configuration
     @EnableIgniteHttpSession
     static class PrimaryIgniteConfiguration extends BaseConfiguration {
 
+        /** */
         @SuppressWarnings("unchecked")
         static IgniteCache<Object, Object> primaryIgniteSessions = mock(IgniteCache.class);
 
+        /** */
         @Bean
         @Primary
         Ignite primaryIgnite() {
@@ -345,16 +385,20 @@
 
     }
 
+    /** */
     @Configuration
     @EnableIgniteHttpSession
     static class QualifiedAndPrimaryIgniteConfiguration extends BaseConfiguration {
 
+        /** */
         @SuppressWarnings("unchecked")
         static IgniteCache<Object, Object> qualifiedIgniteSessions = mock(IgniteCache.class);
 
+        /** */
         @SuppressWarnings("unchecked")
         static IgniteCache<Object, Object> primaryIgniteSessions = mock(IgniteCache.class);
 
+        /** */
         @Bean
         @SpringSessionIgnite
         Ignite qualifiedIgnite() {
@@ -364,6 +408,7 @@
             return ignite;
         }
 
+        /** */
         @Bean
         @Primary
         Ignite primaryIgnite() {
@@ -375,13 +420,16 @@
 
     }
 
+    /** */
     @Configuration
     @EnableIgniteHttpSession
     static class NamedIgniteConfiguration extends BaseConfiguration {
 
+        /** */
         @SuppressWarnings("unchecked")
         static IgniteCache<Object, Object> igniteSessions = mock(IgniteCache.class);
 
+        /** */
         @Bean
         Ignite ignite() {
             Ignite ignite = mock(Ignite.class);
@@ -392,13 +440,16 @@
 
     }
 
+    /** */
     @Configuration
     @EnableIgniteHttpSession
     static class MultipleIgniteConfiguration extends BaseConfiguration {
 
+        /** */
         @SuppressWarnings("unchecked")
         static IgniteCache<Object, Object> secondaryIgniteSessions = mock(IgniteCache.class);
 
+        /** */
         @Bean
         Ignite secondaryIgnite() {
             Ignite ignite = mock(Ignite.class);
@@ -409,9 +460,11 @@
 
     }
 
+    /** */
     @EnableIgniteHttpSession
     static class CustomIndexResolverConfiguration extends BaseConfiguration {
 
+        /** */
         @Bean
         @SuppressWarnings("unchecked")
         IndexResolver<Session> indexResolver() {
@@ -420,15 +473,18 @@
 
     }
 
+    /** */
     @EnableIgniteHttpSession
     static class SessionRepositoryCustomizerConfiguration extends BaseConfiguration {
 
+        /** */
         @Bean
         @Order(0)
         SessionRepositoryCustomizer<IgniteIndexedSessionRepository> sessionRepositoryCustomizerOne() {
             return (sessionRepository) -> sessionRepository.setDefaultMaxInactiveInterval(0);
         }
 
+        /** */
         @Bean
         @Order(1)
         SessionRepositoryCustomizer<IgniteIndexedSessionRepository> sessionRepositoryCustomizerTwo() {
diff --git a/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteITestUtils.java b/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteITestUtils.java
index f18d119..2acc1e6 100644
--- a/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteITestUtils.java
+++ b/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteITestUtils.java
@@ -24,7 +24,6 @@
  * Utility class for Ignite integration tests.
  */
 final class IgniteITestUtils {
-
     private IgniteITestUtils() {
     }
 
diff --git a/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepositoryTests.java b/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepositoryTest.java
similarity index 97%
rename from modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepositoryTests.java
rename to modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepositoryTest.java
index 76cc572..e6c9c1a 100644
--- a/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepositoryTests.java
+++ b/modules/spring-session-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepositoryTest.java
@@ -58,17 +58,21 @@
 /**
  * Tests for {@link IgniteIndexedSessionRepository}.
  */
-class IgniteIndexedSessionRepositoryTests {
-
+public class IgniteIndexedSessionRepositoryTest {
+    /** */
     private static final String SPRING_SECURITY_CONTEXT = "SPRING_SECURITY_CONTEXT";
 
+    /** */
     private final Ignite ignite = mock(Ignite.class);
 
+    /** */
     @SuppressWarnings("unchecked")
     private final IgniteCache<String, IgniteSession> sessions = mock(IgniteCache.class);
 
+    /** */
     private IgniteIndexedSessionRepository repository;
 
+    /** */
     @BeforeEach
     void setUp() {
         given(this.ignite.<String, IgniteSession>getOrCreateCache(
@@ -78,18 +82,21 @@
         this.repository.init();
     }
 
+    /** */
     @Test
     void constructorNullIgnite() {
         assertThatIllegalArgumentException().isThrownBy(() -> new IgniteIndexedSessionRepository(null))
                 .withMessage("Ignite must not be null");
     }
 
+    /** */
     @Test
     void setSaveModeNull() {
         assertThatIllegalArgumentException().isThrownBy(() -> this.repository.setSaveMode(null))
                 .withMessage("saveMode must not be null");
     }
 
+    /** */
     @Test
     void createSessionDefaultMaxInactiveInterval() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -100,6 +107,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void createSessionCustomMaxInactiveInterval() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -113,6 +121,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void saveNewFlushModeOnSave() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -126,6 +135,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void saveNewFlushModeImmediate() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -138,6 +148,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void saveUpdatedAttributeFlushModeOnSave() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -168,6 +179,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void removeAttributeFlushModeOnSave() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -182,6 +194,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void removeAttributeFlushModeImmediate() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -198,6 +211,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void saveUpdatedLastAccessedTimeFlushModeOnSave() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -212,6 +226,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void saveUpdatedLastAccessedTimeFlushModeImmediate() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -228,6 +243,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void saveUpdatedMaxInactiveIntervalInSecondsFlushModeOnSave() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -242,6 +258,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void saveUpdatedMaxInactiveIntervalInSecondsFlushModeImmediate() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -260,6 +277,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void saveUnchangedFlushModeOnSave() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -273,6 +291,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void saveUnchangedFlushModeImmediate() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -287,6 +306,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void getSessionNotFound() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -300,6 +320,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void getSessionExpired() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -317,6 +338,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void getSessionFound() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -333,6 +355,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void delete() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -345,6 +368,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void findByIndexNameAndIndexValueUnknownIndexName() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -357,6 +381,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void findByIndexNameAndIndexValuePrincipalIndexNameNotFound() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -374,6 +399,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void findByIndexNameAndIndexValuePrincipalIndexNameFound() {
         verify(this.sessions, times(1)).registerCacheEntryListener(ArgumentMatchers.any());
@@ -394,26 +420,31 @@
         saved.add(Arrays.asList(ses2, authentication.getPrincipal()));
 
         given(this.sessions.query(ArgumentMatchers.any())).willReturn(new FieldsQueryCursor<List<?>>() {
+            /** */
             @Override
             public String getFieldName(int idx) {
                 return null;
             }
 
+            /** */
             @Override
             public int getColumnsCount() {
                 return 2;
             }
 
+            /** */
             @Override
             public List<List<?>> getAll() {
                 return (List) saved;
             }
 
+            /** */
             @Override
             public void close() {
 
             }
 
+            /** */
             @NotNull
             @Override
             public Iterator<List<?>> iterator() {
@@ -429,6 +460,7 @@
         verifyNoMoreInteractions(this.sessions);
     }
 
+    /** */
     @Test
     void getAttributeNamesAndRemove() {
         IgniteSession session = this.repository.createSession();
@@ -442,6 +474,7 @@
         assertThat(session.getAttributeNames()).isEmpty();
     }
 
+    /** */
     private static TouchedExpiryPolicy createExpiryPolicy(IgniteSession session) {
         return new TouchedExpiryPolicy(
                 new javax.cache.expiry.Duration(TimeUnit.SECONDS, session.getMaxInactiveInterval().getSeconds()));
diff --git a/modules/spring-session-ext/src/test/java/org/apache/ignite/testsuites/IgniteSpringSessionTestSuite.java b/modules/spring-session-ext/src/test/java/org/apache/ignite/testsuites/IgniteSpringSessionTestSuite.java
new file mode 100644
index 0000000..880119e
--- /dev/null
+++ b/modules/spring-session-ext/src/test/java/org/apache/ignite/testsuites/IgniteSpringSessionTestSuite.java
@@ -0,0 +1,19 @@
+package org.apache.ignite.testsuites;
+
+import org.apache.ignite.spring.sessions.EmbeddedIgniteIndexedSessionRepositoryITest;
+import org.apache.ignite.spring.sessions.IgniteHttpSessionConfigurationTest;
+import org.apache.ignite.spring.sessions.IgniteIndexedSessionRepositoryTest;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * Ignite Spring Session Test Suite
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+        EmbeddedIgniteIndexedSessionRepositoryITest.class,
+        IgniteHttpSessionConfigurationTest.class,
+        IgniteIndexedSessionRepositoryTest.class
+})
+public class IgniteSpringSessionTestSuite {
+}
