【问题标题】:Spring Test Dont have access on TestEntityManagerSpring Test 无权访问 TestEntityManager
【发布时间】:2018-07-26 12:53:01
【问题描述】:

我正在尝试使用 @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();
  }
}

最大的问题是我不知道如何授予此访问权限,并且与此消息有关:用户缺少权限或找不到对象:MY_VIEW

Obs.:真正的数据库(不在内存中,不在本次测试中)是 MS SQL Server。

【问题讨论】:

  • test数据库中的数据库表是自动创建的吗?您可以尝试在测试属性中设置spring.jpa.hibernate.ddl-auto=create-drop

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


【解决方案1】:

这不是因为用户权限,而是您的内存数据库中没有创建表,因此您需要将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

【讨论】:

    猜你喜欢
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-28
    • 2020-04-26
    相关资源
    最近更新 更多