Skip to content

Latest commit

 

History

37 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

English|中文

flymock

flymock是一个可以将类直接生成模拟数据对象的java类库。它还可以将类转换为模拟数据模板,再由模拟数据模板生成JSON数据。flymock可以支持广泛的java类型,包含基本类型、复杂对象、泛型、枚举、嵌套泛型等。同时支持字段生成策略和多种占位符。

Flymock目标

  • 提供直接由类型生成模拟Java对象,减少单元测试中new对象和设置值
  • 提供简单的template()和mock()方法,由类型转换为模拟数据模板和由类型直接转为模拟Java对象
  • 广泛的支持Java类型,包括Java泛型
  • 支持7种格式生成规则
  • 支持多样的占位符,例如@cparagraph()、@email()、@ip()、@province(),允许自定义占位符,可通过@FiledMock注解快速设置
  • 支持任意复杂的对象(包括深层嵌套和泛型嵌套、数组)
  • 支持字段全局模拟规则,可根据组织情况,定义个性化、真实性高的模拟数据(X)

Spring-boot-starter-flymock目标

  • 提供SpringBoot starter,与SpringBoot快速集成
  • 提供@EnableFlyMock和spring.fly.mock.enable参数来开关Stater
  • 基于SpringBoot Aop提供和@FlyMock注解,支持拦截类、拦截方法返回模拟Java对象

Maven Setting

<dependency>
   <groupId>com.v2hoping</groupId>
   <artifactId>flymock</artifactId>
   <version>0.1.1</version>
</dependency>
<dependency>
   <groupId>com.v2hoping</groupId>
   <artifactId>spring-boot-starter-flymock</artifactId>
   <version>0.1.1</version>
</dependency>

转换关系

Java类型------>Java模板数据------>JSON数据<------>Java对象

用法

Java类型生成Java对象

//基本类型,举例:Integer
Integer integerValue = TemplateMock.mock(new TypeReference<Integer>() {});
//嵌套复杂对象,举例:User
User userValue = TemplateMock.mock(new TypeReference<User>() {});
//泛型对象,举例:List<Stirng>
List<String> listTValues = TemplateMock.mock(new TypeReference<List<String>>() {});
public class User {
    private String name;

    private List<Education> educations;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Education> getEducations() {
        return educations;
    }

    public void setEducations(List<Education> educations) {
        this.educations = educations;
    }

    public static class Education {
        /**
         * 教育名称
         */
        private String name;

        /**
         * 教育时间
         */
        private Date date;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Date getDate() {
            return date;
        }

        public void setDate(Date date) {
            this.date = date;
        }
    }
}

Java类型生成JSON数据

String userJson = TemplateMock.json(new TypeReference<User>() {});

Java类型生成Java模板

Template<User> template = TemplateMock.template(new TypeReference<User>() {});

Java模板生成JSON数据

String userJson = template.mockToJson();

Java模板生成Java对象

User user = template.mockType();

Java模板字符串生成Java对象

String infoTemplateJson = "{\"name\":\"@string()\",\"educations\":[{\"date\":1557457171390,\"name\":\"vhJ\"}]}";
Template<User> template = new Template<>(infoTemplateJson, new TypeReference<User>(){});
User user = template.mockType();

设置生成策略和占位符

public class Room {
    
    @FiledMock(strategy = "2", value = "邮箱是:@email()")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Template<Room> template = TemplateMock.template(new TypeReference<Room>() {});
Room user = template.mockType();//{"name":"邮箱是:ahu@163.com邮箱是:ahu@163.com","educations":[{"date":1557454313538,"name":"nz8k"}]}

自定义占位符

public static class MoviePlaceholderHandle extends AbstractPlaceholderHandle<String> {

    @Override
    public String invoke(PlaceholderWrap placeholderWrap) {
        List<String> args = placeholderWrap.getArgs();
        if(args.size() == 0) {
            return  "《钢铁侠》";
        }else{
            return  "《钢铁侠" + args.get(0) +"》";
        }
    }

    @Override
    public String key() {
        return "movie";
    }
}

Mock.put(new MoviePlaceholderHandle());
public class Info {

    @FiledMock(strategy = "2", value = "电影是:@movie(2)")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Template<Info> template = TemplateMock.template(new TypeReference<Info>() {});
Info user = template.mockType();//{"name":"电影是:《钢铁侠2》电影是:《钢铁侠2》","educations":[{"date":1557456720233,"name":"wdDK9"}]}

Spring-boot-starter-flymock用法

开启starter

@SpringBootApplication
@ComponentScan(basePackages = {"com.hoping"})
@EnableFlyMock
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

拦截并模拟类的所有方法返回值

@Component
@FlyMock
public class SomeMethod {

    public String sayString() {
        return null;
    }

    public User sayUser() {
        return null;
    }
}

String str = someMethod.sayString();
User user = someMethod.sayUser();

拦截并模拟单个方法返回值

@Component
public class SomeMethod {

    public String sayString() {
        return null;
    }

    @FlyMock
    public User sayUser() {
        return null;
    }
}

User user = someMethod.sayUser();

SpringBoot自定义占位符

@Component
public static class MoviePlaceholderHandle extends AbstractPlaceholderHandle<String> {

    @Override
    public String invoke(PlaceholderWrap placeholderWrap) {
        List<String> args = placeholderWrap.getArgs();
        if(args.size() == 0) {
            return  "《钢铁侠》";
        }else{
            return  "《钢铁侠" + args.get(0) +"》";
        }
    }

    @Override
    public String key() {
        return "movie";
    }
}

更多文档

感谢 & 贡献者

FlyMock参考了Mock.js,模板JSON规范基本互相支持(不完全相同),可以看做是java版本的增强和扩展.

About

flymock is a convenient Java library that can generate mock data directly from class

Topics

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages