You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非SpringBoot核心Java应用的Kafka、MongoDB及映射类JUnit测试需求

核心Java独立应用的JUnit测试示例

一、映射类测试(纯JUnit断言)

映射类是纯POJO转换逻辑,无需外部依赖,直接用JUnit断言验证字段映射正确性。

假设你的映射类为JsonToMongoMapper,负责将Kafka的SourceMessage转换为Mongo的TargetDocument:

import org.junit.Test;
import static org.junit.Assert.*;

public class JsonToMongoMapperTest {

    @Test
    public void testNormalFieldMapping() {
        // 构造源消息
        SourceMessage source = new SourceMessage();
        source.setFieldA("demo-value");
        source.setFieldC(100);

        // 执行映射
        TargetDocument target = JsonToMongoMapper.map(source);

        // 断言映射结果符合预期
        assertEquals("demo-value", target.getFieldB());
        assertEquals(100, target.getFieldD());
        assertNotNull(target.getCreatedAt()); // 验证自动生成的字段
    }

    @Test
    public void testNullSourceFieldMapping() {
        SourceMessage source = new SourceMessage();
        source.setFieldA(null);

        TargetDocument target = JsonToMongoMapper.map(source);

        assertNull(target.getFieldB());
    }
}

二、Kafka消费者测试(使用嵌入式Kafka)

借助第三方嵌入式Kafka库模拟Kafka环境,无需依赖真实集群,测试消息读取与解析逻辑。

Maven依赖

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>2.8.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>io.github.embeddedkafka</groupId>
    <artifactId>embedded-kafka_2.13</artifactId>
    <version>2.8.1</version>
    <scope>test</scope>
</dependency>

测试代码

import io.github.embeddedkafka.EmbeddedKafka;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import java.util.List;
import java.util.Properties;
import static io.github.embeddedkafka.EmbeddedKafka.produce;
import static org.junit.Assert.assertEquals;

public class KafkaMessageConsumerTest {

    private static final String TEST_TOPIC = "test-topic";
    private static KafkaMessageConsumer customConsumer; // 你的自定义消费者类

    @BeforeClass
    public static void initEmbeddedKafka() {
        // 启动嵌入式Kafka
        EmbeddedKafka.start();
        // 初始化自定义消费者,配置指向嵌入式Kafka地址
        Properties consumerProps = new Properties();
        consumerProps.put("bootstrap.servers", EmbeddedKafka.bootstrapServers());
        consumerProps.put("group.id", "test-consumer-group");
        consumerProps.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        consumerProps.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        
        customConsumer = new KafkaMessageConsumer(consumerProps, TEST_TOPIC);
        customConsumer.start();
    }

    @AfterClass
    public static void shutDownEmbeddedKafka() {
        customConsumer.stop();
        EmbeddedKafka.stop();
    }

    @Test
    public void testConsumeAndParseJson() throws InterruptedException {
        // 构造测试JSON消息
        String testJson = "{\"fieldA\":\"kafka-demo\",\"fieldC\":200}";
        // 发送消息到测试Topic
        produce(new ProducerRecord<>(TEST_TOPIC, testJson), EmbeddedKafka.producerConfig());

        // 等待消费者处理消息
        Thread.sleep(1000);
        // 假设消费者提供获取已处理消息的方法
        List<SourceMessage> processedList = customConsumer.getProcessedMessages();

        assertEquals(1, processedList.size());
        assertEquals("kafka-demo", processedList.get(0).getFieldA());
        assertEquals(200, processedList.get(0).getFieldC());
    }
}

三、MongoDB写入测试(使用嵌入式MongoDB)

用嵌入式MongoDB模拟数据库环境,测试数据写入后的持久化正确性,无需连接真实Mongo实例。

Maven依赖

<dependency>
    <groupId>de.flapdoodle.embed</groupId>
    <artifactId>de.flapdoodle.embed.mongo</artifactId>
    <version>3.4.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>4.5.1</version>
    <scope>test</scope>
</dependency>

测试代码

import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import de.flapdoodle.embed.mongo.MongodExecutable;
import de.flapdoodle.embed.mongo.MongodStarter;
import de.flapdoodle.embed.mongo.config.MongodConfig;
import de.flapdoodle.embed.mongo.config.Net;
import de.flapdoodle.embed.mongo.distribution.Version;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static com.mongodb.client.model.Filters.eq;
import static org.junit.Assert.assertEquals;

public class MongoWriterTest {

    private MongodExecutable mongodExecutable;
    private MongoWriter customMongoWriter; // 你的自定义Mongo写入类
    private MongoCollection<TargetDocument> testCollection;

    @Before
    public void initEmbeddedMongo() throws Exception {
        // 启动嵌入式MongoDB
        MongodStarter starter = MongodStarter.getDefaultInstance();
        String bindIp = "localhost";
        int port = 27017;
        MongodConfig mongodConfig = MongodConfig.builder()
                .version(Version.Main.PRODUCTION)
                .net(new Net(bindIp, port, false))
                .build();
        mongodExecutable = starter.prepare(mongodConfig);
        mongodExecutable.start();

        // 初始化Mongo客户端与写入类
        MongoDatabase testDb = MongoClients.create("mongodb://" + bindIp + ":" + port).getDatabase("test-db");
        testCollection = testDb.getCollection("test-collection", TargetDocument.class);
        customMongoWriter = new MongoWriter(testDb, "test-collection");
    }

    @After
    public void shutDownEmbeddedMongo() {
        mongodExecutable.stop();
    }

    @Test
    public void testWriteDocumentToMongo() {
        // 构造目标文档
        TargetDocument testDoc = new TargetDocument();
        testDoc.setFieldB("mongo-demo");
        testDoc.setFieldD(300);

        // 执行写入操作
        customMongoWriter.write(testDoc);

        // 查询验证写入结果
        TargetDocument savedDoc = testCollection.find(eq("fieldB", "mongo-demo")).first();
        assertEquals("mongo-demo", savedDoc.getFieldB());
        assertEquals(300, savedDoc.getFieldD());
    }
}

测试思路总结

  • 映射类:聚焦字段转换逻辑,纯单元测试,仅用JUnit断言即可覆盖场景。
  • Kafka消费者:用嵌入式Kafka模拟完整的生产-消费链路,验证消息读取、JSON解析的正确性。
  • MongoDB写入:用嵌入式Mongo模拟数据库环境,验证数据持久化后的字段一致性。

内容的提问来源于stack exchange,提问作者Vanaja Jayaraman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:01:19