我有一个核心java应用程序(独立而不是springboot)从Kafka主题读取json消息,解析json,将源字段映射到目标字段(Kafka消息中的字段A可能是mongo集合中的字段B)并将其写入mongo收藏。一切正常。
现在我想为 Kafka、mongo 和映射类编写 Junit 测试用例。
在所有论坛中,我都看到带有 springboot 和mockito 的示例。请分享核心 Java 代码的任何示例/参考。
1。测试卡夫卡
对于 Kafka,即使在非 Spring Boot 应用程序中,您也可以使用 spring-kafka-test 库中的 EmbeddedKafka 类:
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.apache.kafka.common.serialization.StringSerializer;
import org.junit.jupiter.api.Test;
import org.springframework.kafka.test.EmbeddedKafkaBroker;
import org.springframework.kafka.test.context.EmbeddedKafka;
import org.springframework.kafka.test.utils.KafkaTestUtils;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertEquals;
@EmbeddedKafka(partitions = 1, topics = { "testTopic" })
public class KafkaTest {
@Test
public void testKafka() {
EmbeddedKafkaBroker embeddedKafka = new EmbeddedKafkaBroker(1, true, 1, "testTopic");
embeddedKafka.afterPropertiesSet();
Map<String, Object> producerProps = KafkaTestUtils.producerProps(embeddedKafka);
ProducerRecord<String, String> record = new ProducerRecord<>("testTopic", "key", "value");
KafkaTestUtils.getKafkaProducer(producerProps).send(record);
Map<String, Object> consumerProps = KafkaTestUtils.consumerProps("testGroup", "true", embeddedKafka);
ConsumerRecord<String, String> received = KafkaTestUtils.getSingleRecord(
KafkaTestUtils.getKafkaConsumer(consumerProps, new StringDeserializer(), new StringDeserializer()), "testTopic");
assertEquals("value", received.value());
}
}
对于 MongoDB,您可以使用 Testcontainers 库来启动 MongoDB 实例进行测试
import org.bson.Document;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.MongoDBContainer;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class MongoTest {
private static MongoDBContainer mongoDBContainer;
private static MongoClient mongoClient;
@BeforeAll
public static void setUp() {
mongoDBContainer = new MongoDBContainer("mongo:4.4.3");
mongoDBContainer.start();
mongoClient = MongoClients.create(mongoDBContainer.getReplicaSetUrl());
}
@AfterAll
public static void tearDown() {
mongoClient.close();
mongoDBContainer.stop();
}
@Test
public void testMongo() {
MongoDatabase database = mongoClient.getDatabase("test");
MongoCollection<Document> collection = database.getCollection("testCollection");
Document doc = new Document("name", "testName");
collection.insertOne(doc);
Document retrievedDoc = collection.find().first();
assertEquals("testName", retrievedDoc.getString("name"));
}
}
对于映射类,您可以使用 JUnit 编写简单的单元测试
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class MappingTest {
@Test
public void testMapping() {
Source source = new Source("fieldAValue");
Target target = new Target();
target.setFieldB(source.getFieldA());
assertEquals("fieldAValue", target.getFieldB());
}
class Source {
private String fieldA;
public Source(String fieldA) {
this.fieldA = fieldA;
}
public String getFieldA() {
return fieldA;
}
}
class Target {
private String fieldB;
public void setFieldB(String fieldB) {
this.fieldB = fieldB;
}
public String getFieldB() {
return fieldB;
}
}
}