在Spring Boot中没有Web或持久层时,是否可以测试嵌套对象?

tb189:

我正在使用JUnit5测试Spring Boot应用程序。我想测试一个@Service使用@Autowired字段对象我想模拟@Service测试对象间接使用的另一个对象。具体而言,我具有以下(高度简化的)设置:

被测试的对象:

@Service
public class MainService {
    
    private @Autowired SubService subService;
    
    public String test() {
        return subService.test();
    }

}

SubService

@Service
public class SubService {
    
    private @Autowired StringService stringService;

    public String test() {
        return stringService.test();
    }

}

StringService

@Service
public class StringService {

    public String test() {
        return "Real service";
    }

}

使用的测试类:

@SpringBootTest
public class MainServiceTest {

    private @Autowired MainService mainService;
    private @MockBean StringService stringService;
    
    @BeforeEach
    public void mock() {
        Mockito.when(stringService.test()).thenReturn("Mocked service");
    }
    
    @Test
    public void test() {
        assertEquals("Mocked service", mainService.test());
    }
    
}

如果我将测试类作为来运行,则上述方法有效@SpringBootTest,但这会加载整个应用程序,并且运行速度很慢。我也想避免,@WebMvcTest因为我不需要Web服务器,或者@DataJpaTest因为我不需要持久性。我不想嘲笑SubService,因为它包含我想和一起测试的功能MainService

我尝试了以下方法:

  • @ExtendWith(SpringExtension.class)=> throws NoSuchBeanDefinitionException,在这种情况下自动布线似乎不起作用
  • @ExtendWith(MockitoExtension.class)并使用@InjectMocks@Mock而不是Spring批注=>,因为这StringService不是MainService被测试的直接字段,所以不起作用。

有没有一种方法可以使用spring依赖注入系统而不加载Web服务器或持久层,或者不使用Spring测试而是允许“嵌套”依赖注入?

Manish Karki:

您可以使用概要分析(即Spring @Profile)来避免加载整个应用程序。它将类似于以下内容:

@Profile("test")
@Configuration
public class TestConfiguration {
    @Bean
    public MainService mainService() {
        return new MainService();
    }

    @Bean
    public SubService subService() {
        return new SubService();
    }
    // mock the StringService
    @Bean
    public StringService stringService() {
        return Mockito.mock(StringService.class);
    }
 
}

然后将该配置文件与`@SpringBootTest(classes = TestConfiguration.class)一起使用,它将类似于以下内容:

@ActiveProfiles("test")
@SpringBootTest(classes = TestConfiguration.class)
class MainServiceTest {

    @Autowired
    private MainService mainService;

    @Test
    public void test() {
        // configure behavior using apis like when(), basically however you 
        // want your mock to behave
    }

}

这将仅加载类中定义的bean TestConfiguration注意:由于您的问题更多是关于如何避免加载整个应用程序的问题,因此我已经集中回答了。上面的方法可以完成工作,但是在任何给定的一天,我都希望构造函数连接比其他任何形式的依赖注入更容易维护和测试(例如您要模拟的情况)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

没有数据库连接的Spring Boot测试

Maven没有运行Spring Boot测试

Spring Security是否可以保护服务层,Web服务层或两者?

在Spring Boot中测试,对数据库没有影响

测试时,有没有办法在Spring中获取Controller的“基本URL”?

使用Junit5在Spring Boot应用程序中测试服务层时如何避免数据库连接

Spring Boot测试-没有合格的Bean异常

如果没有Spring Boot,可以使用领事吗?

如何使用JUnit在Spring Boot中测试服务层的代码?

Spring MVC与Spring Boot与Spring

是否可以在启动或编译时在Spring Boot Stream Kafka中设置groupId?

Spring Boot Web无法将嵌套的json解析为对象

是否可以在没有@DirtiesContext的情况下测试Spring REST控制器?

Spring JPA-持久化嵌套对象

没有Spring数据的Spring Boot JPA

数据没有插入Spring Boot + Spring数据JPA中?

是否可以在没有Redis的情况下使用Spring Boot会话?

Spring MVC:没有价值时,如何测试参数是否存在?

是否可以在Spring Boot中实现一个POJO,该POJO具有一个表示复合主键的字段,而不使用JPA或嵌套类?

Spring Boot层架构

Spring 5.0.7.RELEASE中的Web层单元测试和集成测试

在服务层中进行验证时测试Web层-Spring Boot测试

有没有一种方法可以在Spring Boot中验证@Value?

Spring Boot JPA - 带有嵌套对象和 id 的 json

Spring Boot 中的嵌套请求

Spring Boot Test 没有使用测试属性

在 Spring Boot 应用程序的 JSON 中包含嵌套对象

在 Spring Boot 中测试 JMS 侦听器时,为什么我的 MockBeans 和 MockRestServiceServer 没有返回正确的响应

在 Spring Boot 中使用 ConstraintValidator 时是否可以更改值?