Micronaut单元测试-如何设置默认架构

问题描述 投票:1回答:1

我试图使用单元测试,但在此示例应用程序中找不到设置default schema的方法。这是具有micronaut-dataexamplemodel的简单repository service。在应用程序中使用HSQL数据库,并且Hikari db-pool micronaut-jdbc-hikari

型号Student.java

@Entity
@Table(name="student") 
class Student{

  @Id
  @Column(name="id")
  private Long id;   

  @Column(name="name")     
  private String name;

  public Long getId(){
    return this.id;
  }
  public String getName(){
    return this.name;
  }
  public void setId(Long id){
    this.id = id;
  }
  public void setName(String name){
    this.name = name;
  }
}

存储库StudentRepository.java

@Repository()
public interface StudentRepository extends JpaRepository<Student, Long> {

}

服务StudentService.java

@Singleton
public class StudentService {

    @Inject
    StudentRepository studentRepository;

    public Student getStudentById(Long id) {
        Optional<Student> optional = StudentRepository.findById(id);
        if (optional.isPresent()) {
            return optional.get();
        }
        throw new ApplicationException("No matching data available");
    }

}

单元测试StudentServiceTest.java

@MicronautTest
public class StudentServiceTest {

    @RegisterExtension
    static InMemoryDbExtension inMemoryDbExtension = new InMemoryDbExtension.InMemoryDbBuilder()
            .withSchemaName("TEST_SCHEMA")
            .withSchemaSqls(new String[]{"src/test/resources/memdb/schema.sql"})
            .withTestDataSqls(new String[]{"src/test/resources/db/test.sql"})
            .build();
    private static InMemoryHsqlDb inMemoryHsqlDb;
    @Inject
    private StudentService studentService;

    @BeforeAll
    public static void runBeforeAll(InMemoryHsqlDb inMemoryHsqlDb) {
        StudentServiceTest.inMemoryHsqlDb = inMemoryHsqlDb;
    }

    @Test
    public void shouldTestGetById() {
        Student s = new Student();
        s.setId(5);
        s.setName("XYZ");
        studentService.save(s); // query generated: insert into student(id, name) values (?,?)
    }
}

问题:有一些方法可以找到我们可以在哪里设置默认模式的方法,但是每种方法都有问题。

  1. 使用存储库注释@Table(schema="TEST_SCHEMA", name="student") <=正常。但是不能对模式名称进行硬编码
  2. 使用存储库批注@Table(schema="#{property.file.schema_name}", name="student") <= Spring表达式,SpEL不起作用

3。使用application-test.yml文件:[无效,查询未选择模式名称]。

jpa:
      default:
        entity-scan:
          packages: 'com.example.model'
          properties:
            hibernate:
              hbm2ddl:
                auto: update
              default-schema: TEST_SCHEMA # <= default schema, also tried default_schema
              show_sql: true

4。使用application-test.yml文件在数据源中指定架构:但这不起作用,因为尚未创建架构,它将在测试类中创建。因此无法加载应用程序。

datasources:
  default:
    driverClass: org.hsqldb.jdbc.JDBCDriver
    url: jdbc:hsqldb:mem:testdb;sql.syntax_ora=true
    username: sa
    autoCommit: false
    maximumPoolSize: 1
    leakDetectionThreshold: 180000
    poolName: hikariConnectionPoolName
    minimumIdle: 5
    schema: TEST_SCHEMA  # <= default schema

================================================ =========暂时解决方法

[table_name的同义词用作schema_name.table_name因此,当创建不具有模式的查询时,同义词将被替换。为student生成同义词test_schema.student以便该查询将被正确翻译:

生成的查询=>insert into student(id, name) values (?,?)翻译查询=> insert into test_schema.student(id, name) values (?,?)

单元测试StudentServiceTest.java

@BeforeAll
    public static void runBeforeAll(InMemoryHsqlDb inMemoryHsqlDb) {
        StudentServiceTest.inMemoryHsqlDb = inMemoryHsqlDb;
        // workaround for not using schema
        inMemoryHsqlDb.getJdbi().open().execute("create synonym STUDENT for TEST_SCHEMA.STUDENT");
    }
java junit5 hikaricp micronaut micronaut-data
1个回答
0
投票

在官方文档中有关于GORM的内容。这可以帮助您解决问题吗?

© www.soinside.com 2019 - 2024. All rights reserved.