减少加载JUnit测试所需的类

8 浏览
0 Comments

减少加载JUnit测试所需的类

假设我正在测试一个仓库:\n

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

\n我可以接受Spring加载其他仓库,但我不希望它每次运行这些JUnit时都加载嵌入的Tomcat、服务、控制器等等。\n实现这一目标最简单的方法是什么?\n我尝试了在内部使用@Configuration类和@ComponentScan,限制在我的仓库包中,但它没有起作用(被忽略了)。

0
0 Comments

在进行JUnit测试时,有时会出现需要最小化加载的类的情况。这个问题没有一个单一的答案。对于JPA repositories,使用 @DataJpaTest 是最好的选择,但要确保在测试数据不在内存数据库中而是在实际数据库中时使用 "(replace = Replace.NONE)"。此外,在Spring文档中有一个特殊的章节讨论了这个问题,它提到了Spring Boot的自动配置系统对于应用程序工作得很好,但有时对于测试来说可能有些过多。它通常有助于只加载测试所需的配置的部分,以测试应用程序的“片段”。

但是,这并没有展示出你可以/需要做的所有事情。例如,我有一个需要测试的smtpClientService。为了单独测试这个服务在它自己的层中,我必须进行以下特定的适应(如果我省略 "@Bean",我将无法注入RestTemplateBuilder):

@RunWith(SpringRunner.class)
public class smtpClientServiceTest {
  SmtpClientService service;
  @TestConfiguration
  @Import(SmtpClientConfig.class)
  @ComponentScan(basePackageClasses = SmtpClientService.class)
  static class TestConfiguration {
  }  
  public void testSendMessage() {
    (...)
  }
}

0
0 Comments

在进行JUnit测试时,可能会遇到加载过多类的问题。这种情况的原因是在测试中引入了不必要的类,导致加载过多的类,从而降低了测试的效率。为了解决这个问题,可以使用注解@RunWith(SpringRunner.class)来替代@SpringBootTest注解。这样只会加载与持久化相关的Spring部分,避免了加载其他不必要的类。以下是一个示例:

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

更详细的解决方法可以在这里找到。

如果在测试中使用了JdbcTemplate,可以参考这个答案

虽然这些方法很有用,但并不适用于所有情况。如果你正在使用spring-jdbc并且可能只有一个服务依赖的测试,可能更好的做法是在问题中明确说明你正在使用JdbcTemplate

需要注意的是,这个问题并不仅限于仓库层,这只是一个示例。同时,虽然找到了一些解决方法,但它们仍然只是部分答案。

0