Spring Boot的单元测试(Unit Test)(一)

最近做了一些Spring Boot单元测试方面的东西,总结一下。

单元测试尽量要和Spring Boot框架减少耦合度,当你在测试某一项功能点是需要mock太多的对象时你就应该意识到这个功能点的耦合度太高了

使用Constructor Injection,不要使用Field Injection。这样才能更容易写单元测试代码。在Spring Framework 4.3以后,如果你只有一个Constructor, 就不再需要写@Autowired,Spring会默认他是autowire目标:

public class OrderEntryServiceImpl implements OrderEntryService {    
    private OrderEntryRepository orderEntryRepository;
    public OrderEntryServiceImpl(OrderEntryRepository repository)
    {
        orderEntryRepository=repository;
    }
}

这样的话在单元测试中初始化对象就很容易

public class OrderEntryServiceTest {

    @MockBean
    private OrderEntryRepository orderEntryRepository;
    private OrderEntryService service;

    @Before
    public void setUp()
    {
        orderEntryRepository=Mockito.mock(OrderEntryRepository.class);
        service=new OrderEntryServiceImpl(orderEntryRepository);
    }
    private OrderEntry orderEntry=new OrderEntry();

    @Test
    public void findByIdTest()
    {
        Mockito.when(orderEntryRepository.findOne(Mockito.anyLong())).thenReturn(orderEntry);
        OrderEntry entry=service.findById(new Long(1));
        assertEquals(entry.getId(),orderEntry.getId());
    }

    @Test
    public void updateEntryTest() throws Exception
    {
        final String orderEntryJson = IOUtils.toString(this.getClass().getResourceAsStream("/static/meta-data/orderentry-example.json"),
                CharEncoding.UTF_8
        );
        ObjectMapper mapper= ObjectMapperFactory.getInstance();
        
        Mockito.when(orderEntryRepository.getOne(Mockito.anyLong())).thenReturn(orderEntry);
        Mockito.doAnswer(returnsFirstArg()).when(orderEntryRepository).save(Mockito.any(OrderEntry.class));
        OrderEntry entry =service.update(new Long(1),mapper.readTree(orderJson));
        assertEquals(new Long(2),entry.getQuantity());
        assertEquals(new Double(10),entry.getUnitPrice());
    }
}

测试Spring Repository,我们可以使用@DataJpaTest,这样我们就可以使用TestEntityManager来测试我们Repository的功能了。

@RunWith(SpringRunner.class)@DataJpaTestpublic class ClientRepositoryTest {

    @Autowired
    private TestEntityManager entityManager;    
    @Autowired
    private ClientRepository clientRepository;    
    @Test
    public void testFindByName() {
        entityManager.persist(new Client("Wang"));

        Optional<Client> client = clientRepository.findByName("Wang");
        assertEquals("Wang", client.get().getName());
    }
}

测试JSON的序列化和反序列化,需要用@JsonTest

@RunWith(SpringRunner.class)
@JsonTestpublic 
class CustomerJsonTests {

    private JacksonTester<Customer> json;

    @Test
    public void serializeJson() {
        Customer customer= new Customer(
            "wang");

        assertThat(this.json.write(details))
            .extractingJsonPathStringValue("@.name")
            .isEqualTo("wang");
    }
}

测试Spring MVC Controller,需要用到@WebMvcTest

@Autowired
private MockMvc mockMvc;

@MockBean
private OrderEntryService orderEntryService;

@Test
public void updateOrderEntryByIDTest() throws Exception
{
    final String orderEntryJson = IOUtils.toString(this.getClass().getResourceAsStream("/static/meta-data/orderentry-example.json"),
            CharEncoding.UTF_8
    );
    Mockito.when(orderEntryService.findById(Mockito.anyLong())).thenReturn(entry);
    RequestBuilder requestBuilder = MockMvcRequestBuilders.patch("/orderentries/1").accept(
            MediaType.APPLICATION_JSON)
            .contentType(contentType)
            .content(orderEntryJson);
    MvcResult result= mockMvc.perform(requestBuilder).andReturn();
    assertEquals(HttpStatus.ACCEPTED.value(),result.getResponse().getStatus());
时间: 2024-10-10 13:08:23

Spring Boot的单元测试(Unit Test)(一)的相关文章

Spring Boot的单元测试(Unit Test)

最近做了一些Spring Boot单元测试方面的东西,总结一下. 单元测试尽量要和Spring Boot框架减少耦合度,当你在测试某一项功能点是需要mock太多的对象时你就应该意识到这个功能点的耦合度太高了 使用Constructor Injection,不要使用Field Injection.这样才能更容易写单元测试代码.在Spring Framework 4.3以后,如果你只有一个Constructor, 就不再需要写@Autowired,Spring会默认他是autowire目标: pub

(转)Spring Boot Junit单元测试

场景:在项目开发中要测试springboot工程中一个几个dao和service的功能是否正常,初期是在web工程中进行要素的录入,工作量太大.使用该单元测试大大减小了工作强度. Junit这种老技术,现在又拿出来说,不为别的,某种程度上来说,更是为了要说明它在项目中的重要性.凭本人的感觉和经验来说,在项目中完全按标准都写Junit用例覆盖大部分业务代码的,应该不会超过一半. 刚好前段时间写了一些关于SpringBoot的帖子,正好现在把Junit再拿出来从几个方面再说一下,也算是给一些新手参考

Spring Boot 单元测试示例

Spring 框架提供了一个专门的测试模块(spring-test),用于应用程序的单元测试. 在 Spring Boot 中,你可以通过spring-boot-starter-test启动器快速开启和使用它. 在pom.xml文件中引入maven依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artif

从.Net到Java学习第四篇——spring boot+redis

从.Net到Java学习第一篇——开篇 从.Net到Java学习第二篇——IDEA and start spring boot 从.Net到Java学习第三篇——spring boot+mybatis+mysql 接上一篇,本篇使用到的框架redis.FastJSON. 环境准备 安装redis,下图是我本机的redis绿色版,你可以网上自行下载安装,如果不知道如何怎么操作,可以移步到我的另一篇文章:ASP.NET Redis 开发 以管理员身份打开CMD窗口: C:\Users\zouqj>e

Spring Boot(十二):Spring Boot 如何测试打包部署

有很多网友会时不时的问我, Spring Boot 项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下 Spring Boot 如何开发.调试.打包到最后的投产上线. 开发阶段 单元测试 在开发阶段的时候最重要的是单元测试了, Spring Boot 对单元测试的支持已经很完善了. 1.在 pom 包中添加 spring-boot-starter-test 包引用 <dependency> <groupId>org.springframework.boot&

在Spring Boot项目中使用Spock测试框架

摘自:https://www.cnblogs.com/javaadu/p/11748473.html 本文首发于个人网站:在Spring Boot项目中使用Spock测试框架 Spock框架是基于Groovy语言的测试框架,Groovy与Java具备良好的互操作性,因此可以在Spring Boot项目中使用该框架写优雅.高效以及DSL化的测试用例.Spock通过@RunWith注解与JUnit框架协同使用,另外,Spock也可以和Mockito(Spring Boot应用的测试——Mockito

Spring Boot入门及第一个案例

一:SpringBoot是什么 springboot是对spring的缺点进行改善和优化,约定大于配置  开箱即用  没有代码生成 也无需xml 文件配置   可以修改属性值来满足需求 1) Spring Boot使编码变简单 2) Spring Boot使配置变简单 3) Spring Boot使部署变简单 4) Spring Boot使监控变简单 二:创建第一个SpringBoot工程 1.点击File--->New--->Project... 2.输入MAVEN,组名.包名等相关参数 3

spring boot?Swagger2文档构建及单元测试

首先,回顾并详细说明一下在快速入门中使用的@Controller.@RestController.@RequestMapping注解.如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建议先看一下快速入门的内容. @Controller:修饰class,用来创建处理http请求的对象 @RestController:Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如果直接用@RestController替代@Contro

Spring Boot构建RESTful API与单元测试

全套教程:http://git.oschina.net/didispace/SpringBoot-Learning 首先,回顾并详细说明一下在快速入门中使用的@Controller.@RestController.@RequestMapping注解.如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建议先看一下快速入门的内容. @Controller:修饰class,用来创建处理http请求的对象 @RestController:Spring4之后加入的注解,原来在@Control