java Instancio可以为接口和抽象类生成数据吗

5anewei6  于 2023-03-16  发布在  Java
关注(0)|答案(1)|浏览(166)

我曾经使用Easy-Random来生成JUnit 5测试数据,但是因为它似乎不再被开发了,不支持Java记录,而且总的来说似乎比Instancio灵活性更低,所以我决定迁移。Instancio,开箱即用,提供了很多很好的特性,可以实现更快的测试(更容易的参数化测试,考虑到Javax等),但是有一个缺点。
持久层返回的对象是某个记录接口的自动生成实现,如下所示:

interface SomeRecord {
  getUid();
}

Easy-Random能够找到实现并生成随机记录。
我在Instancio的文档或其他地方找不到任何关于如何解决这个问题或解决方案的信息。有人能做类似的事情吗?

vuktfyat

vuktfyat1#

对于一次性情况,最简单的选择是手动指定实施,例如

Person person = Instancio.of(Person.class)
    .subtype(all(Pet.class), Cat.class)
    .create();

但是,我假设您希望自动找到实现,如果是这样,有几个选项。
1.实现TypeResolver(请参阅示例服务提供程序文档):

class MyTypeResolver implements TypeResolver {
    private Map<Class<?>, Class<?>> subtypeMap = new HashMap<>();

    @Override
    public Class<?> getSubtype(Class<?> type) {
        return subtypeMap.get(type);
    }
}

Map可以手动指定,也可以通过使用类库(如ClassGraph)扫描类路径来自动指定。
See this GitHub repo for a sample implementation
1.另一种方法是通过SettingsMap类型,也可以手动指定或自动指定,例如:https://github.com/dafriedmann/instancio-jandex-subtype-mapping

相关问题