在没有启动应用程序的情况下,在SpringBoot中编写单元测试

时间:2020-11-11 03:33:18

标签: spring-boot junit

我正在springBoot中开发MicroServices。正在为Service和DAO层编写单元测试。当我使用 @SpringBootTest 时,它将在构建时启动应用程序。但是它不应该开始申请 当我运行单元测试时。我使用了 @RunWith(SpringRunner.class),但是无法在junit类中使用 @Autowired 类实例。如何配置不应启动应用程序的junit测试类,以及如何在junit类中 @Autowired 类实例。

3 个答案:

答案 0 :(得分:1)

使用Spring Boot,您可以启动a sliced version of your application进行测试。这将创建一个Spring Context,它仅包含相关的bean的子集,例如仅适用于您的网络层(控制器,过滤器,转换器等):@WebMvcTest

有一个类似的注释可以帮助您测试DAO,因为它仅填充JPA和数据库相关的bean(例如EntitiyManagerDatasource等):@DataJpaTest

如果您要自动装配不属于上述注释所创建的Spring Test Context的一部分的豆,则可以使用@TestConfiguration手动将所需的任何bean添加到测试上下文中

@WebMvcTest(PublicController.class)
class PublicControllerTest {

  @Autowired
  private MockMvc mockMvc;

  @TestConfiguration
  static class TestConfig {

    @Bean
    public EntityManager entityManager() {
      return mock(EntityManager.class);
    }

    @Bean
    public MeterRegistry meterRegistry() {
      return new SimpleMeterRegistry();
    }

  }
}

答案 1 :(得分:1)

如果不想启动完整的应用程序,请使用MockitoJUnitRunner进行JUnit5测试。

@Mock注释可以模拟任何服务,存储库和接口。

@InjectMocks用于需要测试的Class对象。

这是一个例子。

@RunWith(MockitoJUnitRunner.class)
@SpringBootTest
public class AServiceTest {
    
    @InjectMocks
    AService aService;
    
    @Mock
    ARepository aRepository;
    
    @Mock
    UserService userService;
    
    
    @Before
    public void setUp() {
        // MockitoAnnotations.initMocks(this);
        // anything needs to be done before each test.
    }
    
    @Test
    public void loginTest() {
        Mockito.when(aRepository.findByUsername(ArgumentMatchers.anyString())).thenReturn(Optional.empty());
        String result = aService.login("test");
        assertEquals("false", result);
    }

答案 2 :(得分:1)

根据您的测试设置,如果您不想自动装配模拟而是“真实的东西”,您可以简单地注释您的测试类以准确包含您需要的类(加上它们的传递必要时依赖)

例如:

@SpringJUnitConfig({ SimpleMeterRegistry.class })

@SpringJUnitConfig
@Import({ SimpleMeterRegistry.class })

@SpringJUnitConfig
@ContextConfiguration(classes = { SimpleMeterRegistry.class })

在此处查看基于 JUnit5 的示例Spring Boot Web Data JDBC allin

相关问题