最小化要为JUnit测试加载的类

时间:2018-11-22 14:25:10

标签: java spring spring-boot

假设我正在测试存储库:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTest {
  @Test
  (...)
  @Test
  (...)
}

我可以确定春天会加载其他存储库,但是我不能确定每次我启动这些JUnit之一时都会加载嵌入式Tomcat,服务,控制器...。

最简单的方法是什么?

我试图将一个内部@Configuration类和一个@ComponentScan限制在我的存储库程序包中,但是它没有用(只是被忽略了)。

2 个答案:

答案 0 :(得分:2)

使用注释@DataJpaTest代替@SpringBootTest。它只加载Spring的持久性相关部分。

@RunWith(SpringRunner.class)
@DataJpaTest
public class UserRepositoryTest {
  @Test
  (...)
  @Test
  (...)
}

您会找到详细的解决方案here

如果您经常使用JdbcTemplate,请看看this answer

答案 1 :(得分:0)

对于这个问题,似乎没有一个答案。

当然,对于JPA存储库,最好的回答是:使用@DataJpaTest(对于我的用例,请使用@JdbcTest)。但是,如果测试数据在数据库中而不是内存中,请确保使用“ @AutoConfigureTestDatabase(replace = Replace.NONE)”。

Spring文档中还有一章专门讨论这一点:

  

Spring Boot的自动配置系统非常适合应用程序   但有时对于测试来说可能有点过多。它通常有助于   仅加载测试a所需的配置部分   您的应用程序的“切片”。

源:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications-testing-autoconfigured-tests

但是它并没有显示您可以/需要做的所有事情。

例如,我要测试一个smtpClientService。

要单独测试该服务,必须在其自己的层中进行这些特定的修改(如果省略“ @AutoConfigureWebClient”,则不会注入RestTemplateBuilder):

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureWebClient
public class smtpClientServiceTest {

  @Autowired
  SmtpClientService service;

  @Configuration
  @Import(SmtpClientConfig.class)
  @ComponentScan(basePackageClasses = SmtpClientService.class)
  static class TestConfiguration {
  }  

  @Test
  public void testSendMessage() {
    (...)
  }

}