Skip to content

Commit

Permalink
完善@MockClass相关逻辑
Browse files Browse the repository at this point in the history
  • Loading branch information
woilsy committed Jul 17, 2023
1 parent 58475bf commit 790fb79
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 14 deletions.
4 changes: 3 additions & 1 deletion app/src/main/java/com/woilsy/mock/test/entity/AnyData.kt
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
package com.woilsy.mock.test.entity

import com.woilsy.mock.annotations.Mock
import com.woilsy.mock.annotations.MockClass

/**
* Any的场景一般为可能为多个内容中的一个,一般和某个字段的某个值形成键值对。--暂未实现
*/
class AnyData(
val type: Int,
@MockClass(Data1::class)
@MockClass(className = "com.woilsy.mock.test.entity.Data1")
val data: Any,
)

data class Data1(
val age: Int,
@Mock("我是自定义的数据")
val name: String
)
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@

String className() default "";

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,11 @@ private Object generatorFinalObj(Class<?> cls, Field parentField) {
}

/**
* 通过class获取带有mock数据字段的新的实例
* 通过class获取带有mock数据字段的新的实例,如果一个class内部包含@Mock注解,需要通过它来生成对象。
*/
private Object generatorClsObj(Class<?> cls) {
if (!checkClass(cls)) {
if (cls == null) return null;
if (cls == ResponseBody.class) {
loge("()->" + cls.getName() + "不支持创建,直接返回");
return null;
}
Expand All @@ -92,10 +93,6 @@ private Object generatorClsObj(Class<?> cls) {
return obj;
}

private boolean checkClass(Class<?> cls) {
return cls != ResponseBody.class;
}

private void handleField(Object obj, Type type, Field f) throws IllegalAccessException {
if (type instanceof Class) {
if (checkField(f)) {
Expand Down Expand Up @@ -177,15 +174,17 @@ private Object getMockFieldData(Class<?> cls, Annotation[] annotations) {
return MockRangeUtil.stringRange((MockStringRange) annotation);
} else if (annotation instanceof MockClass) {
MockClass mockClass = (MockClass) annotation;
//仅处理这一个场景
//仅处理这一个场景 生产的class对象 需要重新进入解析流程 不能直接通过ClassUtils直接返回
if (cls == Object.class) {
Class<?> value = mockClass.value();
//仅有默认值 返回
Class<?> gClass = null;
if (value == Object.class) {
return ClassUtils.newClassInstance(mockClass.className());
gClass = ClassUtils.getClassByName(mockClass.className());
} else {
return ClassUtils.newClassInstance(value);
gClass = value;
}
return generatorClsObj(gClass);
}
}
}
Expand Down
10 changes: 7 additions & 3 deletions mock/src/main/java/com/woilsy/mock/utils/ClassUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -111,16 +111,20 @@ public static <T> Object allocateInstance(Class<T> cls) {
}

@Nullable
public static Object newClassInstance(String className) {
public static Class<?> getClassByName(String className) {
try {
if (className == null || className.isEmpty()) return null;
Class<?> aClass = Class.forName(className);
return newClassInstance(aClass);
return Class.forName(className);
} catch (ClassNotFoundException e) {
return null;
}
}

@Nullable
public static Object newClassInstance(String className) {
return newClassInstance(getClassByName(className));
}

/**
* 通过class生成一个对象
*/
Expand Down

0 comments on commit 790fb79

Please sign in to comment.