Java Micronaut单元测试-如何设置默认模式

Java Micronaut单元测试-如何设置默认模式,java,junit5,hikaricp,micronaut,micronaut-data,Java,Junit5,Hikaricp,Micronaut,Micronaut Data,我尝试使用单元测试,但在这个示例应用程序中找不到设置默认模式的方法。 这是一个简单的micronaut数据,具有模型、存储库和服务。应用程序中使用HSQL数据库,Hikari db池micronaut jdbc Hikari 模型:Student.java @Entity @Table(name="student") class Student{ @Id @Column(name="id") private Long id; @Column(name="name")

我尝试使用单元测试,但在这个示例应用程序中找不到设置
默认模式的方法。
这是一个简单的
micronaut数据
,具有
模型
存储库
服务
。应用程序中使用HSQL数据库,Hikari db池
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;
  }
}
@Repository()
public interface StudentRepository extends JpaRepository<Student, Long> {

}
@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");
    }

}
@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 (?,?)
    }
}
@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");
    }
存储库
StudentRepository.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;
  }
}
@Repository()
public interface StudentRepository extends JpaRepository<Student, Long> {

}
@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");
    }

}
@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 (?,?)
    }
}
@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");
    }
单元测试
StudentServiceTest.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;
  }
}
@Repository()
public interface StudentRepository extends JpaRepository<Student, Long> {

}
@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");
    }

}
@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 (?,?)
    }
}
@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");
    }
问题: 我可以找到一些方法来设置默认模式,但每种方法都有它的问题


  • 使用存储库注释
    @Table(schema=“TEST_schema”,name=“student”)
    在官方文档中,有一些关于。这也许能帮你解决你的问题吗?

    在官方文件中有一些关于。这可能有助于解决您的问题吗?

    您可以尝试在初始化数据库时执行脚本,并在加载数据库时加载架构:

    在application-test.yml中,您可以更改数据源配置:

    datasources:
      default:
        driverClass: org.hsqldb.jdbc.JDBCDriver
        url: "jdbc:hsqldb:mem:testdb;sql.syntax_ora=true;INIT=runscript from 'classpath:/init_db.sql'"
        username: sa
        autoCommit: false
        maximumPoolSize: 1
        leakDetectionThreshold: 180000
        poolName: hikariConnectionPoolName
        minimumIdle: 5
    
    线路

    url: "jdbc:hsqldb:mem:testdb;sql.syntax_ora=true;INIT=runscript from 'classpath:/init_db.sql'"
    
    将使用一个init sql脚本启动数据源,该脚本可以包含默认模式,如果需要,还可以包含一些数据。这种方法的缺点是,在单元测试开始之前,数据库只初始化一次,所以您必须记住这一点

    init_db.sql scprit必须位于测试资源文件夹中,并且应该包含脚本“src/test/resources/memdb/schema.sql”和“src/test/resources/db/test.sql”的内容

    然后单元测试就变成了

    @MicronautTest
    public class StudentServiceTest {
    
        @Inject
        private StudentService studentService;
    
        @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 (?,?)
        }
    }
    

    您可以尝试在初始化数据库时执行脚本,并在加载数据库时加载架构:

    在application-test.yml中,您可以更改数据源配置:

    datasources:
      default:
        driverClass: org.hsqldb.jdbc.JDBCDriver
        url: "jdbc:hsqldb:mem:testdb;sql.syntax_ora=true;INIT=runscript from 'classpath:/init_db.sql'"
        username: sa
        autoCommit: false
        maximumPoolSize: 1
        leakDetectionThreshold: 180000
        poolName: hikariConnectionPoolName
        minimumIdle: 5
    
    线路

    url: "jdbc:hsqldb:mem:testdb;sql.syntax_ora=true;INIT=runscript from 'classpath:/init_db.sql'"
    
    将使用一个init sql脚本启动数据源,该脚本可以包含默认模式,如果需要,还可以包含一些数据。这种方法的缺点是,在单元测试开始之前,数据库只初始化一次,所以您必须记住这一点

    init_db.sql scprit必须位于测试资源文件夹中,并且应该包含脚本“src/test/resources/memdb/schema.sql”和“src/test/resources/db/test.sql”的内容

    然后单元测试就变成了

    @MicronautTest
    public class StudentServiceTest {
    
        @Inject
        private StudentService studentService;
    
        @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 (?,?)
        }
    }
    

    您是否尝试过
    schema=“${property.file.schema_name}”
    而不是
    schema=“${property.file.schema_name}”
    ?@JeffScottBrown是的,我也尝试过。但它也不起作用。它采用的是模式的完整单词,而不是
    schema=“#{property.file.schema\u name}”
    你试过
    schema=“${property.file.schema\u name}”
    ?@JeffScottBrown是的,我也试过了。但它也不起作用。它采用完整的单词作为模式。