java - 在 Java 中使用 Redis 异步命令对 void 方法进行单元测试

标签 java asynchronous junit redis lettuce

我正在尝试为以下功能编写单元测试。

responseHandlerErrorHandler 都是使用命令模式传递的方法 并用于继续程序的流程。 futureCommand 是一个 lettuce 对象(Java 中的 Redis 实现)。 我在如何测试此方法时遇到困难,因为它既使用 future 又不返回任何内容。

public void getOfferData(EventRequestContext<? extends BaseEvent> ctx, int offerId, ResponseHandler<T1Offer> responseHandler,
        ErrorHandler<Throwable> errorHandler) throws Exception {
    String redisKey = keyPrefix + offerId;
    RedisFuture<List<String>> futureCommand = connectionWrapper.getHashValues(redisKey, getRequiredParams());
    futureCommand.thenAccept(valuesList -> {
        TrackerScheduler.processT1GenreicPool.execute(ctx, () -> {
            Map<String, String> resultMap = reconstructMapValues(valuesList, getRequiredParams(), redisKey, ctx);
            T1Offer offerData;
            if(!resultMap.isEmpty()) {
                offerData = new T1Offer(resultMap);
            } else {
                offerData = new T1Offer();
            }
            if(!offerData.isValid()) {
                errorHandler.onError(new Exception("Invalid fields in offerData"));
            } else {
                responseHandler.onResponse(offerData);
            }
        });
    });
}

我最好的尝试是使用 responseHandler 方法发送断言,如下所示:

@Test
public void getOfferData_offerFullData_parseSuccess() throws Exception {
    T1ClickOfferDao.instance.getOfferData(null, Integer.parseInt(OFF_ID), resultOffer -> { 
        Assert.assertEquals("", resultOffer.getActivationDate());
    }, error -> {
    });
}

但是在评估 future 之前,测试上下文已经完成。即使我 Threas.sleep 一秒钟 - 断言也不会影响测试结果。

最佳答案

怎么样

@Test
public void getOfferData_offerFullData_parseSuccess() throws Exception {
    final String lock = new String("lock");
    T1ClickOfferDao.instance.getOfferData(null, Integer.parseInt(OFF_ID), resultOffer -> { 
        Assert.assertEquals("", resultOffer.getActivationDate());
        synchronized(lock){
            lock.notifyAll();
        }
    }, error -> {
    });
    synchronized(lock){
        try{ 
            lock.wait(1000*2); 
        } catch (InterruptedException ex) {
            fail("Timeout");
        }
    }
}

关于java - 在 Java 中使用 Redis 异步命令对 void 方法进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48005733/

相关文章:

java - 在 Java 中将类似数组的 String 转换为 ArrayList

python - python中的异步I/O是什么?

java - 如何模拟对象构造函数中使用的函数(使用 Mockito)?

java - 我可以根据其他属性设置类 "property"吗?

java - 反射(reflection) - Java 8 - 无效的常量类型

javascript - NodeJS异步模块: how to get results object in the callback?

ios - 处理失败的后台 API POST

java - 运行包含 junit 的 jar

java - 在 Sonar 上发布 JUnit 测试报告

java - Eclipse文本编辑器获取光标位置