我已经开始在项目中使用Redis,并借助Jedis库。一切都运作正常,但现在我的功能测试需要Redis处于启动状态,我希望在持续集成中避免这种情况。有什么最好的方法可以做到这一点吗?
以下是功能/集成测试的几个选项:
需要注意的一件事是,集成测试不应替换单元测试。单元测试可能更受欢迎,因为它们可以涵盖更多情况,而集成测试只能用于检查应用程序的所有部分是否良好地运行在一起。我认为这就是为什么很多人选择第一种选项的原因。
这里有一个类似的问题关于mongodb。答案中有一个链接到该项目的答案,该项目可以用于第二个选项(控制mongodb进程)。如果您在项目页面上跟随一些相关链接,还有一些叫做nosql-unit的内容。我没用过它,但看起来它也适用于redis。
redis-server --port 7777
。因此,为了进行集成测试,您可以在可用(或随机)端口上启动Redis,并确保Jedis配置为使用该端口。--dbfilename <file>
开关:redis-server --port 7777 --dbfilename test.rdb
。尝试使用nosql-unit。它支持使用Java进行Redis单元测试。
我已经尝试过EmbeddedRedis,发现许多Jedis接口不受支持。因此,在使用一些高级Redis功能(如“pipeline”)时,使用EmbbededRedis不是一个好主意。
我建议使用ManagedRedis进行单元测试:
RedisTemplate
。之后,我只需使用@MockBean
来模拟服务并抽象化测试期间缺少运行中的Redis实例的情况。@Service
class RedisService {
@Autowired
private RedisTemplate<String, SomeClass> redisTemplate;
SomeClass get(String key) {
return redisTemplate.opsForValue().get(key);
}
}
在集成测试中:
class IntegrationTest {
@MockBean
private RedisService redisService;
@Before
public void setup() {
SomeClass someClass= new SomeClass();
when(redisService.get(anyString())).thenReturn(someClass);
}
}
我对使用一些redis内存数据库解决方案持怀疑态度,因为我了解到实际的替代方案并没有得到Spring团队的“官方”推荐。
正如@ksytrc在他的回答中提到的那样,我基本上使用了他的解决方案。它在这个项目中运行良好。你只需要添加embedded-redis依赖项。
<dependency>
<groupId>com.github.kstyrc</groupId>
<artifactId>embedded-redis</artifactId>
<version>0.6</version>
<scope>test</scope>
</dependency>
然后在测试类中定义redisServer
RedisServer redisServer;
@Before
public void setUp() throws IOException {
redisServer = new RedisServer();
redisServer.start();
}
同时定义以下凭据的application.yml
。
spring:
redis:
host: localhost
port: 6379