在SpringBoot中编写单元测试,无需启动应用程序

vfwfrxfs  于 2023-03-29  发布在  Spring
关注(0)|答案(4)|浏览(622)

我在springBoot中开发微服务。我正在为服务和DAO层编写单元测试。当我使用**@SpringBootTest时,它会在构建时启动应用程序。但当我运行单元测试时,它不应该启动应用程序。我使用@RunWith(SpringRunner.class),但我无法在junit类中@Autowired类示例。如何配置不应启动应用程序的junit测试类以及如何@Autowired**class instance in junit class.

nmpmafwu

nmpmafwu1#

如果您不想启动完整的应用程序,请使用MockitoJUnitRunner进行JUnit 5测试。
任何Service、Repository和Interface都可以通过@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);
    }
anhgbhbe

anhgbhbe2#

使用Sping Boot ,您可以启动a sliced version of your application进行测试。这将创建一个Spring Context,其中仅包含与您的Web层(控制器,过滤器,转换器等)相关的bean的子集:@WebMvcTest
有一个类似的注解可以帮助你测试你的DAO,因为它只填充JPA和数据库相关的bean(例如EntitiyManagerDatasource等):@DataJpaTest .
如果你想自动连接一个bean,而这个bean不是由上面的annotatiosn创建的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();
    }

  }
}
5sxhfpxr

5sxhfpxr3#

根据你的测试设置,如果你不想自动连接一个mock,而是“真实的东西”,你可以简单地注解你的测试类,以包含你需要的类(如果需要的话,加上它们的传递依赖关系)
例如:

@SpringJUnitConfig({ SimpleMeterRegistry.class })

@SpringJUnitConfig
@Import({ SimpleMeterRegistry.class })

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

请参阅此处Spring Boot Web Data JDBC allin中基于JUnit5的工作示例。

uinbv5nw

uinbv5nw4#

为了避免运行整个应用程序,请包含以下Mockito注解,并exclude@SpringBootTest

@RunWith(MockitoJUnitRunner.class)
@ExtendWith(MockitoExtension.class)

最后的单元测试是:

@RunWith(MockitoJUnitRunner.class) // No @SpringBootTest! just Mockito RunWith/ExtendWith
@ExtendWith(MockitoExtension.class)
class Ar11ApplicationTest {

    @Mock // what we're mocking
    Ar11ApplicationService ar11ApplicationService;
    
    @Mock // what we're mocking
    EmailService emailService;
    
    @InjectMocks  // what we're actually testing
    Ar11Application ar11Application;
    
    @BeforeEach
    void setUp() throws Exception {
        
        // Set up an example mock behavior 
         Mockito.when(ar11ApplicationService.processEligibleRecords(
                                    Mockito.anyString(), Mockito.anyString(),                                                                
                                    Mockito.anyString(), Mockito.anyString(), 
                                    Mockito.anyString(), Mockito.anyString(), 
                                    Mockito.anyString())
                 .thenReturn(new Ar11ResultBean(500));
    }

    @Test
    void runTest1() throws Exception {
          //..
    }

(But请注意,如果您有一些应用程序测试属性YAML,您需要@SpringBootTest来读取它们-例如application-test.yaml。在这种情况下,您不能避免@SpringBootTest。它可以与@Import一起使用,以导入任何对象的自定义模拟类-例如here

相关问题