我正在对连接到 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/