diff --git a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithOpenTracingTest.java b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithOpenTracingTest.java
index c173b8ef790b1711e906fad8a2c8f3ff26e7b70f..1d8ac85b272c46d85f2a7e8eff501e7f500b525c 100644
--- a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithOpenTracingTest.java
+++ b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithOpenTracingTest.java
@@ -75,6 +75,7 @@ import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.awaitility.Awaitility.waitAtMost;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyLong;
@@ -209,7 +210,8 @@ public class DefaultMQConsumerWithOpenTracingTest {
assertThat(msg.getTopic()).isEqualTo(topic);
assertThat(msg.getBody()).isEqualTo(new byte[]{'a'});
- assertThat(tracer.finishedSpans().size()).isEqualTo(1);
+ // wait until consumeMessageAfter hook of tracer is done surely.
+ waitAtMost(1, TimeUnit.SECONDS).until(() -> tracer.finishedSpans().size() == 1);
MockSpan span = tracer.finishedSpans().get(0);
assertThat(span.tags().get(Tags.MESSAGE_BUS_DESTINATION.getKey())).isEqualTo(topic);
assertThat(span.tags().get(Tags.SPAN_KIND.getKey())).isEqualTo(Tags.SPAN_KIND_CONSUMER);
diff --git a/pom.xml b/pom.xml
index 3714eb344ee21b5c180be979e46b7c11fe83a49c..634a0fbac351003e093cd53ed67eb39cf041a684 100644
--- a/pom.xml
+++ b/pom.xml
@@ -439,6 +439,12 @@
3.10.0
test
+
+ org.awaitility
+ awaitility
+ 4.1.0
+ test
+