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

chr*_*ris 6 java junit5 instancio

我曾经使用 Easy-Random 来生成 JUnit5 测试数据,但由于它似乎不再开发,不支持 Java 记录,并且总体上似乎不如 Instancio 灵活,所以我决定迁移。Instancio 开箱即用,提供了许多不错的功能,可以实现更快的测试(更简单的参数化测试,考虑到 Javax 等),但有一个缺点。

我们的持久层返回的对象是一些记录接口的自动生成的实现,如下所示:

interface SomeRecord {
  getUid();
}
Run Code Online (Sandbox Code Playgroud)

Easy-Random 能够找到实现并生成随机记录。

我在 Instancio 的文档或其他任何地方找不到有关如何解决此问题或解决方法的任何信息。有人能够做类似的事情吗?

arm*_*ino 3

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

Person person = Instancio.of(Person.class)
    .subtype(all(Pet.class), Cat.class)
    .create();
Run Code Online (Sandbox Code Playgroud)

但是,我假设您希望自动找到实现。如果是这样,有几个选择。

  1. 实现TypeResolver(请参阅InstancioServiceProvider 文档):
class MyTypeResolver implements TypeResolver {
    private Map<Class<?>, Class<?>> subtypeMap = new HashMap<>();

    @Override
    public Class<?> getSubtype(Class<?> type) {
        return subtypeMap.get(type);
    }
}
Run Code Online (Sandbox Code Playgroud)

映射可以手动指定,也可以通过使用库(例如 ClassGraph)扫描类路径来自动指定。

请参阅此 GitHub 存储库以获取示例实现

  1. 另一种方法是通过 映射类型Settings。这也可以手动或自动指定,例如: https: //github.com/dafriedmann/instancio-jandex-subtype-mapping