diff --git a/src/test/java/org/apache/ibatis/reflection/wrapper/BeanWrapperUnitTest.java b/src/test/java/org/apache/ibatis/reflection/wrapper/BeanWrapperUnitTest.java
new file mode 100644
index 00000000000..79023a15236
--- /dev/null
+++ b/src/test/java/org/apache/ibatis/reflection/wrapper/BeanWrapperUnitTest.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright 2009-2024 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ibatis.reflection.wrapper;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.domain.blog.Author;
+import org.apache.ibatis.domain.misc.RichType;
+import org.apache.ibatis.reflection.SystemMetaObject;
+import org.apache.ibatis.reflection.property.PropertyTokenizer;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * @author mawen12
+ * @see BeanWrapper
+ */
+class BeanWrapperUnitTest extends ObjectWrapperBaseTest {
+
+ private RichType richType;
+
+ private ObjectWrapper wrapper;
+
+ @BeforeEach
+ void setup() {
+ this.richType = new RichType();
+ this.wrapper = new BeanWrapper(SystemMetaObject.forObject(richType), richType);
+ }
+
+ @Test
+ @Override
+ void shouldGet() {
+ richType.setRichProperty("mybatis");
+
+ Object value = wrapper.get(new PropertyTokenizer("richProperty"));
+
+ assertEquals("mybatis", value);
+ }
+
+ @Test
+ void shouldGetWhichContainsDelim() {
+ RichType nested = new RichType();
+ nested.setRichProperty("mybatis");
+ richType.setRichType(nested);
+
+ Object value = wrapper.get(new PropertyTokenizer("richType.richProperty"));
+
+ assertEquals("mybatis", value);
+ }
+
+ @Test
+ void shouldGetWhichContainsIndex() {
+ richType.setRichList(Arrays.asList(1L, "abc"));
+ richType.setRichMap(new HashMap(){{
+ put("key1", "value1");
+ put("key2", "value2");
+ }});
+
+ assertEquals("abc", wrapper.get(new PropertyTokenizer("richList[1]")));
+ assertEquals("value2", wrapper.get(new PropertyTokenizer("richMap[key2]")));
+
+ }
+
+ @Test
+ @Override
+ void shouldSet() {
+ wrapper.set(new PropertyTokenizer("richProperty"), "mybatis");
+
+ assertEquals("mybatis", richType.getRichProperty());
+ }
+
+ @Test
+ void shouldSetWhichContainsDelim() {
+ wrapper.set(new PropertyTokenizer("richType.richProperty"), "mybatis");
+
+ assertEquals("mybatis", richType.getRichType().getRichProperty());
+ }
+
+ @Test
+ void shouldSetWhichContainsIndex() {
+ List