import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.stereotype.Component;
/**
* 集成测试总入口
* 项目启动后会自动执行所有方法
* com.test.integrate包下类中加上@RunMethod的方法,
*/
@Component
@ConditionalOnExpression("${unitcase.biz.enable:false}")
@Slf4j
public class IntegrationTest implements CommandLineRunner {
@Override
public void run(String... args){
RunClassHolder.run();
}
}
import com.test.annotation.RunMethod;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.concurrent.ExecutorService;
/**
* 根据class获取bean
*/
@Component
@Slf4j
public class RunClassHolder implements ApplicationContextAware {
private static ExecutorService analysisExecutor = ThreadUtil.newFixedThreadPool("integration-test", 32);
public static ApplicationContext ctx;
public static void run(){
List<Class> classList = ClazzUtils.getClazz();
for(Class clazz : classList){
analysisExecutor.submit(() -> {
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
if (method.getAnnotation(RunMethod.class) == null){
continue;
}
try {
method.invoke(RunClassHolder.getBean(clazz));
} catch (IllegalAccessException e) {
log.error("执行集成测试报错",e);
} catch (InvocationTargetException e) {
log.error("执行集成测试报错",e);
}
}
});
}
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ctx = applicationContext;
}
/**
* 根据类型获得bean
*/
public static <T> T getBean(Class<T> clazz) {
return ctx.getBean(clazz);
}
/**
* 根据名称名称获得bean
*/
public static Object getBean(String name) {
return ctx.getBean(name);
}
}
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.util.ClassUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 获取某个包下所有class
*/
@Slf4j
public class ClazzUtils {
private static final String BASE_PACKAGE = "com.test.integrate";
private static final String RESOURCE_PATTERN = "/**/*.class";
public static List<Class> getClazz() {
List<Class> classList = new ArrayList<>();
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
try {
String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
ClassUtils.convertClassNameToResourcePath(BASE_PACKAGE) + RESOURCE_PATTERN;
Resource[] resources = resourcePatternResolver.getResources(pattern);
MetadataReaderFactory readerfactory = new CachingMetadataReaderFactory(resourcePatternResolver);
for (Resource resource : resources) {
MetadataReader reader = readerfactory.getMetadataReader(resource);
String classname = reader.getClassMetadata().getClassName();
Class<?> clazz = Class.forName(classname);
classList.add(clazz);
}
} catch (IOException | ClassNotFoundException e) {
log.error("获取集成测试类失败",e);
}
return classList;
}
}
package com.test.integrate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 测试类
*/
@Service
public class Test {
@Resource
private TestService testService;
@RunMethod
public void smsTemplateTest(){
//todo 这里组装逻辑
}
}