Skip to content

Commit f555b06

Browse files
committed
Current state of affairs: I've noticed a big problem with my Integration Tests setup; it's why I'm currently struggling to test my early boilerplate setup files for Redis. I had written out a file to test simple Redis connectivity, but it wouldn't run because it kept trying to load everything in the Spring context (e.g., Postgres), and certain dependencies weren't satisfied. My IntegrationTestBase.java file is too heavy and @SpringBootTest tries loading the whole application. Solution atm is to use Slice Tests for the Redis-specific tests but I should make a note of this grander design issue (TO-DO:).
1 parent 8f968ca commit f555b06

10 files changed

Lines changed: 130 additions & 5 deletions

File tree

springqpro-backend/src/main/java/com/springqprobackend/springqpro/config/RedisConfig.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
package com.springqprobackend.springqpro.config;
1+
/*package com.springqprobackend.springqpro.config;
22
33
import com.fasterxml.jackson.annotation.JsonAutoDetect;
44
import com.fasterxml.jackson.annotation.PropertyAccessor;
55
import com.fasterxml.jackson.databind.ObjectMapper;
66
import org.springframework.context.annotation.Bean;
77
import org.springframework.context.annotation.Configuration;
8+
import org.springframework.context.annotation.Profile;
89
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
910
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
1011
import org.springframework.beans.factory.annotation.Value;
@@ -14,11 +15,12 @@
1415
1516
// 2025-11-21-REDIS-PHASE-NOTE: THIS FILE CREATES CONNECTION FACTORY AND REDIS TEMPLATE W/ JACKSON SERIALIZER:
1617
@Configuration
18+
@Profile("!test")
1719
public class RedisConfig {
1820
@Bean
1921
public LettuceConnectionFactory redisConnectionFactory(
2022
@Value("${spring.redis.host}") String host,
21-
@Value("${spring.redis.port") int port
23+
@Value("${spring.redis.port}") int port
2224
) {
2325
RedisStandaloneConfiguration cfg = new RedisStandaloneConfiguration(host, port);
2426
return new LettuceConnectionFactory(cfg);
@@ -40,3 +42,4 @@ public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory conn
4042
return template;
4143
}
4244
}
45+
*/

springqpro-backend/src/main/java/com/springqprobackend/springqpro/redis/RedisDistributedLock.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
- How to use: String token = lock.tryLock("task:lock:"+id, 10000); if(token!=null){ try { ... } finally { lock.unlock(...); } }
1414
SO BASICALLY, safe lock happens using SET NX PX, and we use a Lua script to unlock it. That's how this is going to work.
1515
*/
16-
@Component
16+
/*@Component
1717
public class RedisDistributedLock {
1818
// Field(s):
1919
private final RedisTemplate<String, Object> redis;
@@ -42,3 +42,4 @@ public boolean unlock(String key, String token) {
4242
return res != null && res > 0;
4343
}
4444
}
45+
*/

springqpro-backend/src/main/java/com/springqprobackend/springqpro/redis/TaskRedisRepository.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
- This file is a thin cache abstraction.
1515
- We'll be caching TaskEntity (DB representation, not domain Task). This is good DDD (Domain-Driven Design): Cache the authoritative persisted shape.
1616
*/
17-
@Component
17+
/*@Component
1818
public class TaskRedisRepository {
1919
// Field(s):
2020
private static final String TASK_KEY_PREFIX = "task:";
@@ -43,3 +43,4 @@ public void delete(String id) {
4343
}
4444
// DEBUG:+NOTE:+TO-DO: I can add other methods like exists(), setIfAbsent() and so on...
4545
}
46+
*/

springqpro-backend/src/main/resources/application-prod.yml

Whitespace-only changes.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.springqprobackend.springqpro.config;
2+
3+
import org.springframework.boot.test.context.TestConfiguration;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.data.redis.connection.RedisConnectionFactory;
6+
import org.springframework.data.redis.core.RedisTemplate;
7+
import org.springframework.data.redis.core.StringRedisTemplate;
8+
9+
@TestConfiguration
10+
public class RedisTestConfig {
11+
@Bean
12+
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
13+
RedisTemplate<String, Object> template = new RedisTemplate<>();
14+
template.setConnectionFactory(factory);
15+
return template;
16+
}
17+
18+
@Bean
19+
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
20+
return new StringRedisTemplate(factory);
21+
}
22+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*package com.springqprobackend.springqpro.integration;
2+
3+
import org.junit.jupiter.api.BeforeAll;
4+
import org.junit.jupiter.api.Test;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.boot.test.context.SpringBootTest;
7+
import org.springframework.context.annotation.Import;
8+
import org.springframework.data.redis.core.RedisTemplate;
9+
import org.springframework.test.context.ActiveProfiles;
10+
import org.testcontainers.containers.GenericContainer;
11+
import org.testcontainers.junit.jupiter.Container;
12+
import org.testcontainers.junit.jupiter.Testcontainers;
13+
14+
import com.springqprobackend.springqpro.config.RedisConfig;
15+
16+
@SpringBootTest(classes = { RedisConfig.class })
17+
@ActiveProfiles("test")
18+
@Testcontainers
19+
public class RedisPingIntegrationTest {
20+
21+
@Container
22+
static GenericContainer<?> redis =
23+
new GenericContainer<>("redis:7.2")
24+
.withExposedPorts(6379);
25+
26+
@Autowired
27+
RedisTemplate<String, Object> redisTemplate;
28+
29+
@BeforeAll
30+
static void setup() {
31+
System.setProperty("spring.redis.host", redis.getHost());
32+
System.setProperty("spring.redis.port",
33+
redis.getMappedPort(6379).toString());
34+
}
35+
36+
@Test
37+
void redisPingPong() {
38+
String key = "ping";
39+
String value = "pong";
40+
41+
redisTemplate.opsForValue().set(key, value);
42+
43+
String fetched = (String) redisTemplate.opsForValue().get(key);
44+
45+
assert fetched != null;
46+
assert fetched.equals(value);
47+
}
48+
}
49+
*/
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.springqprobackend.springqpro.testcontainers;
2+
3+
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
4+
import org.testcontainers.containers.GenericContainer;
5+
6+
public abstract class BaseRedisContainer {
7+
@ServiceConnection
8+
protected static final GenericContainer<?> REDIS
9+
= new GenericContainer<>("redis:7-alpine")
10+
.withExposedPorts(6379)
11+
.withReuse(true);
12+
static {
13+
REDIS.start();
14+
}
15+
}

springqpro-backend/src/test/java/com/springqprobackend/springqpro/testcontainers/IntegrationTestBase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@
1212
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
1313
@Testcontainers
1414
public abstract class IntegrationTestBase extends BasePostgresContainer {
15-
}
15+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*package com.springqprobackend.springqpro.testcontainers;
2+
3+
import com.springqprobackend.springqpro.config.RedisTestConfig;
4+
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
5+
import org.springframework.boot.test.autoconfigure.data.redis.DataRedisTest;
6+
import org.springframework.boot.test.context.SpringBootTest;
7+
import org.springframework.context.annotation.Import;
8+
import org.springframework.test.context.DynamicPropertyRegistry;
9+
import org.springframework.test.context.DynamicPropertySource;
10+
import org.testcontainers.junit.jupiter.Testcontainers;
11+
12+
@DataRedisTest
13+
@Testcontainers
14+
@Import(RedisTestConfig.class)
15+
@EnableAutoConfiguration(exclude = {
16+
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration.class,
17+
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.class,
18+
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration.class
19+
})
20+
public abstract class RedisIntegrationTestBase extends BaseRedisContainer {
21+
@DynamicPropertySource
22+
static void overrideRedisProps(DynamicPropertyRegistry registry) {
23+
registry.add("spring.redis.host", REDIS::getHost);
24+
registry.add("spring.redis.port", () -> REDIS.getMappedPort(6379));
25+
}
26+
}*/
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
spring:
2+
redis:
3+
host: localhost
4+
port: 6379
5+
password:
6+
timeout: 2000
7+
main:
8+
allow-bean-definition-overriding: true

0 commit comments

Comments
 (0)