在单元测试中使用spring-boot-starter-data-jpa的Spring Boot需要强制@DataJpaTest

时间:2017-09-20 16:51:50

标签: java spring jpa spring-boot spring-data-jpa

我正在测试Spring Boot功能作为该领域的新手。我有一个基本依赖的简单应用程序。

  • sping-boot-starter-parent 1.5.7
  • 消费满引导起动
  • 消费满引导起动数据-JPA
  • 消费满引导起动测试

然后有一个带有@SpringBootApplication注释的简单Application类。 然后我有一个带@Service注释的简单DummyService。 然后,我创建了一个简单的测试DummyServiceTest,其中包含一个@Test方法以及@RunWith(SpringRunner.class)@SpringBootTest注释。

@SpringBootTest是关键问题。使用spring-boot-starter-data-jpa依赖项,此注释测试甚至需要@DataJpaTest注释。没有它,即使测试不需要使用数据,框架也不会解决HibernateJpaAutoConfigurationDataSource或其他注入依赖关系。

我可以以某种方式抑制它吗?我不是任何一种Spring大师所以我的猜测是有一些简单的配置来处理这个问题。

P.S。好的,回到树上。即使使用@DataJpaTest,测试也无法解决数据依赖性问题。我尝试添加@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE),但它也无法正常工作。我尝试使用相同的结果添加@Transactional。它有点荒谬了。

1 个答案:

答案 0 :(得分:0)

如果您还没有使用JPA,那么注释掉/删除build.gradle中的依赖项,直到您使用JPA。在Hibernate和/或JPA配置成功完成之前,您需要定义数据源和其他配置详细信息。在@SpringApplicationConfiguration代码运行时,每个应用程序依赖项都会得到解决,即使您当前的#hello world"测试不需要JPA数据。

我当前的单元测试实际上已将@SpringBootTest注释掉了。以下是我在应用程序的JPA相关测试中如何设置和工作的简化视图:

@RunWith(SpringJUnit4ClassRunner)
@SpringApplicationConfiguration(classes = DaemonApplication)
@ActiveProfiles('local')
//@SpringBootTest
@Transactional
public abstract class AbstractJpaTest extends AbstractTransactionalJUnit4SpringContextTests { 
    @BeforeTransaction
    public void setupData() throws Exception {
        deleteFromTables('User', 'User_Session', 'User_Handshake');
    }
}

然后

class UserHandshakeRepositoryIntegrationTest extends AbstractJpaTest {

@Autowired UserHandshakeRepoImpl handshakeRepository;    


@Test
public void testSave() {
    UserHandshake handshake = handshakeRepository.save(new UserHandshake());
    assertThat(handshake.getId(), is(notNullValue()));
}