使用 h2 进行 Spring Junit 测试 - 找不到表

Posted

技术标签:

【中文标题】使用 h2 进行 Spring Junit 测试 - 找不到表【英文标题】:Spring Junit testing with h2 - Table not found 【发布时间】:2015-03-02 20:26:43 【问题描述】:

我正在尝试测试我的一项服务,但它突然失败并出现以下异常。

我正在尝试找出导致此异常抛出的原因:

Caused by: org.h2.jdbc.JdbcSQLException: Table "XYZ" not found; SQL statement:
insert into xyz (id, xx_id, yy_id, order, path, place_id, primary) values (null, ?, ?, ?, ?, ?, ?) [42102-183]

连接:

 Creating new JDBC Driver Connection to [jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false]

用于测试的PersistenceContext:

@Configuration
public class PersistenceContext 

    @Bean
    public EmbeddedDatabase dataSource() 
        return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .addScript("classpath:sql/db-schema.sql")
                .build();
    


db-schema.sql

CREATE TABLE xyz(
  id int(11) NOT NULL,
  xx_id int(11) NULL,
  yy_id int(11) NULL,
  path varchar(200) NOT NULL,
  date_time_added datetime NOT NULL,
  "order" int(11) DEFAULT NULL,
  "primary" bit(1) DEFAULT NULL,
  PRIMARY KEY (id),
  CONSTRAINT fk_xx FOREIGN KEY (xx_id) REFERENCES xx (id) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT fk_yy FOREIGN KEY (yy_id) REFERENCES yy (id) ON DELETE NO ACTION ON UPDATE NO ACTION
);

抛出错误的类

private Image addXyzForXX(MultipartFile file, Xx xx) throws ... 
    String destDir = resourceService.getPlacesUploadDir();
    Xyz xyz = new Xyz();

    xyz.setXx(xx);

    String filePath = imageUploadService.upload(file, destDir);

    java.util.Date dt = new java.util.Date();

    java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    String currentTime = sdf.format(dt);

    xyz.setPath(filePath);
    xyz.setDateTimeAdded(currentTime);

    xyz.setOrder(1);
    xyz.setPrimary(true);

    xyz = xyzRepository.save(xyz);
    return xyz;

Xyz 存储库

@Repository
public interface XyzRepository extends PagingAndSortingRepository<Xyz, Long> 



@Entity
@Table(name = "xyz")
public class Xyz
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String path;
    private String dateTimeAdded;
    private Integer order;
    private Boolean primary;

    @ManyToOne(optional=true)
    @JoinColumn(name = "xxId")
    private Xx xx;

    [getters and setters for each field]

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
public class ImageServiceTest 
    @Autowired
    private XyzService xyzService;
    @Autowired
    private XxService xxService;
    @Test
    public void testArgumentsNullity3() throws Exception 
        XX xx = new XX("a", "b", "c", "d", "e");
        xx= xxService.addXx(xx);
        xyzService.addImage(XxService.Scope.XX, xx,new MockMultipartFile("a","a","image/jpeg", new byte[1024]));
    

【问题讨论】:

你能显示产生错误的测试类吗? @willOEM 我更新了我的初始评论 您仍然没有显示实际的测试类。我怀疑您的测试上下文没有正确配置您的数据库。 【参考方案1】:

我发现了真正的问题。

我在最初的帖子中显示的异常消息缺少一些重要的东西。在堆栈跟踪中还有其他内容说“糟糕的 sql 语法”。我专注于“图像”表,因为这是堆栈跟踪中的第一件事。

在检查了所有可能的已知问题后,我尝试重命名实体中的字段,因为我认为 H2 会将它们解释为关键字。

重命名字段后,一切正常。

【讨论】:

很高兴你明白了!

以上是关于使用 h2 进行 Spring Junit 测试 - 找不到表的主要内容,如果未能解决你的问题,请参考以下文章

Spring4 JUnit 测试:将 SQL 加载到 H2 数据库

Spring Hibernate H2 Junit 测试 - 如何在启动时加载模式

如何告诉 Spring Boot 使用另一个数据库进行测试?

事务不适用于 Spring 3.1 – H2 – junit 4 – hibernate 3.2

使用 JPA 和 JUnit 测试时如何一致地擦除内存数据库中的 H2 [重复]

Spring boot - h2 DB 测试多次执行脚本