Spring Test无法访问TestEntityManager

时间:2018-02-15 17:13:34

标签: spring spring-data-jpa hsqldb spring-test in-memory-database

我正在尝试使用@DataJpaTest执行一些测试,但是我无法保存我的对象来创建我的断言。

Doc for TestEntityManager

当我尝试保存我的实体时,我在日志中得到以下结果:

15/02/2018 14:58:40.565 WARN  [main] org.hibernate.engine.jdbc.spi.SqlExceptionHelper: SQL Error: -5501, SQLState: 42501
15/02/2018 14:58:40.565 ERROR [main] org.hibernate.engine.jdbc.spi.SqlExceptionHelper: user lacks privilege or object not found: MY_VIEW in statement [select validviewl0_.cpf as cpf1_0_0_, validacaol0_.rating as rating7_0_0_ from dbo.my_view validviewl0_ where validviewl0_.cpf=?]

这是我对测试类的注释:

@ActiveProfiles("test")
@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = Replace.ANY, connection = EmbeddedDatabaseConnection.HSQL)
public class MyRepositoryTest {
  @Autowired
  private TestEntityManager testEntityManager

  @Autowired
  private MyRepository myRepository;

  @Before
  public void setup() {
    Assert.assertTrue(testEntityManager.getEntityManager().isOpen());
    testEntityManager.persist(MyEntity.builder()
      .cpf("11122233344").build());
    testEntityManager.flush();
  }

  @After
  public void after() {
    testEntityManager.clear();
  }
}

BIG的问题是我不知道如何获取此访问权限并且是关于此消息:用户缺少权限或找不到对象:MY_VIEW

Obs。:真正的数据库(不是内存而不是此测试)是MS SQL Server。

1 个答案:

答案 0 :(得分:0)

这不是因为用户权限,而是在内存数据库中未创建表格,因此您需要将generate-ddl添加到您的媒体资源中。

还尝试使用以下方法进行注释测试:

@RunWith(SpringRunner.class)
@AutoConfigureTestDatabase(replace = Replace.ANY)
@Transactional
@SpringBootTest

添加H2或HSQL数据库进行测试(或等效于Maven):

testCompile 'com.h2database:h2' 

Application.yml属性示例:

spring: 
  jpa:
    database: default
    generate-ddl: true
    properties: 
      hibernate: 
        show_sql: true 
        use_sql_comments: true
        format_sql: true
  datasource:
    url: jdbc:h2:mem:your_test_db;DB_CLOSE_ON_EXIT=FALSE
    username: sa
    password: 
    driverClassName: org.h2.Driver

如果您使用@Transactional标记测试,则数据库将在测试后进行回滚,因此您无需使用@After来清除它。有关详情,请访问Should my tests be @Transactional?

如果这不起作用,请尝试简单EntityManager而不是TestEntityManager