我已经在Jedis库的帮助下开始在我的项目中使用Redis了。一切正常,但现在我遇到了一个问题,我的功能测试要求Redis在我的持续集成中要避免。这样做的最佳方式是什么?
答案 0 :(得分:17)
我为Java实现了一个简单的redis嵌入式运行器: https://github.com/kstyrc/embedded-redis
目前,它使用redis 2.6.14表示* nix,使用https://github.com/MSOpenTech/redis表示Windows。但是,您可以使用RedisServer类来运行自己的运行脚本。
我计划扩展实现以支持RedisConf(bind,slaveof,port,dbfilename等)。在此之后,我会将jar上传到clojars for mvn deps。
答案 1 :(得分:8)
以下是功能/集成测试的几个选项:
有一点需要提及的是,集成测试不应取代单元测试。单元测试应该是首选,它们可以涵盖更多情况,而集成测试可以用于检查应用程序的所有部分是否可以很好地协同工作。而且我认为这就是为什么很多人选择选择第一选项的原因。
这是一个类似的问题about mongodb答案有一个链接到项目,该项目适用于第二个选项(控制mongodb进程)如果您在项目页面上关注一些相关链接,那么还有一个名为nosql-unit的东西。我认为这个试图涵盖选项三。我没有使用它,但看起来它也有redis的东西。
答案 2 :(得分:1)
您可以通过命令行在任意端口上启动Redis服务器:redis-server --port 7777
。因此,出于集成测试的目的,您可以在可用(或随机)端口上启动Redis,确保将Jedis配置为使用该端口。
通过这种方式,您可以获得一个“新鲜”的Redis实例,您知道它不会与任何其他进程冲突,包括同时发生的其他测试运行。这与我能想到的运行内存/嵌入式数据库进行集成测试的模拟结果非常接近。
要使用“预制数据”预加载Redis,请使用--dbfilename <file>
开关:redis-server --port 7777 --dbfilename test.rdb
。
答案 3 :(得分:1)
尝试nosql-unit。它支持使用java进行redis单元测试。
我尝试过EmbeddedRedis,发现不支持许多Jedis接口。因此使用EmbbededRedis并不是一个好主意,特别是当你使用一些高级redis函数时,例如&#34; pipeline&#34;。
我建议使用ManagedRedis进行单元测试:
答案 4 :(得分:0)
正如his answer中提到的@ksytrc我基本上使用了他的解决方案。它在this project中工作。您只需添加嵌入式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
答案 5 :(得分:0)
解决这个问题的更好方法是创建一个处理RedisTemplate
的Spring服务。之后,我仅使用@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团队并非“正式”推荐实际的替代方案。