mocking - 如何在没有嵌入式服务器或新集群的情况下模拟 couchbase 以进行验收测试?

标签 mocking netty couchbase acceptance-testing wiremock

我正在对连接到 couchbase、elasticsearch 和 Kafka 的微服务进行验收测试。我不想使用任何嵌入式实例或任何测试集群。我希望能够模拟 couchbase 调用,但同时应该测试我编写的 N1QL 查询。

对于 elasticsearch,我正在使用 Wiremock 并模拟 REST 调用。但是对于 couchbase,我不知道客户端对数据库进行的其余调用的结构。

另外,我继续编写了一个测试用例。有了这个,我从错误消息中模拟了 couchbase 所做的所有 REST 调用。但是我看到 coouchbase 连接到 netty channel ,我该如何模拟该 channel ?

如果不是这样,有没有更好的方法来模拟 couchbase?

RxComputationScheduler- 3|ERROR||||c.c.c.d.i.n.u.c.D.rejectedExecution|181|Failed to submit a listener notification task. Event loop shut down?
java.util.concurrent.RejectedExecutionException: event executor terminated
at com.couchbase.client.deps.io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:796)
at com.couchbase.client.deps.io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:336)
at com.couchbase.client.deps.io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:329)
at com.couchbase.client.deps.io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:739)
at com.couchbase.client.deps.io.netty.util.concurrent.DefaultPromise.safeExecute(DefaultPromise.java:760)
at com.couchbase.client.deps.io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:428)
at com.couchbase.client.deps.io.netty.util.concurrent.DefaultPromise.setFailure(DefaultPromise.java:113)
at com.couchbase.client.deps.io.netty.channel.DefaultChannelPromise.setFailure(DefaultChannelPromise.java:87)
at com.couchbase.client.core.endpoint.AbstractEndpoint$3.call(AbstractEndpoint.java:381)
at com.couchbase.client.core.endpoint.AbstractEndpoint$3.call(AbstractEndpoint.java:374)
at rx.internal.operators.SingleOperatorOnErrorResumeNext$2.onError(SingleOperatorOnErrorResumeNext.java:69)
at rx.internal.operators.SingleTimeout$TimeoutSingleSubscriber$OtherSubscriber.onError(SingleTimeout.java:133)
at rx.Single$1.call(Single.java:477)
at rx.Single$1.call(Single.java:473)
at rx.Single.subscribe(Single.java:1979)
at rx.Single$18.call(Single.java:2518)
at rx.Single$18.call(Single.java:2505)
at rx.internal.operators.SingleTimeout$TimeoutSingleSubscriber.call(SingleTimeout.java:110)
at rx.internal.schedulers.EventLoopsScheduler$EventLoopWorker$2.call(EventLoopsScheduler.java:189)
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

这是我遇到的错误。

最佳答案

另一个选项可能是使用 Testcontainers 模块。这里有一个用于 Couchbase:https://www.testcontainers.org/modules/databases/couchbase/

来自网站的构建存储桶的示例:

public class SomeTest {

    @Rule
    public CouchbaseContainer couchbase = new CouchbaseContainer()
             .withClusterAdmin("admin", "secret")
             .withNewBucket(DefaultBucketSettings.builder()
                        .enableFlush(true)
                        .name("bucket-name")
                        .password("secret")
                        .quota(100)
                        .type(BucketType.COUCHBASE)
                        .build());

    @Test
    public void someTestMethod() {
        Bucket bucket = couchbase.getCouchbaseCluster().openBucket("bucket-name");

        // ... interact with client as if using Couchbase normally
    }
}

关于mocking - 如何在没有嵌入式服务器或新集群的情况下模拟 couchbase 以进行验收测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54459867/

相关文章:

c# - 单元测试 EF 的状态管理代码

java - Netty 4 - 使用不同的线程进行发送和接收

java - netty:保存 channel 处理程序上下文以供以后使用

unit-testing - 能够将数组传递给模拟方法调用

unit-testing - 单元测试术语概述( stub 与模拟、集成与交互)?

php - 仅断言模拟调用的单元测试

python - 如何创建使用 Couchbase Python 客户端的 AWS Lambda 部署包

java - 设置开发服务器的上下文 [playframework 2.1.3]

c# - 如何像在 NoSQL 中那样实现 select ...?

nosql - 如何连接 n1ql 中的两个字段?