2017-06-01 72 views
0

我完全不熟悉Junit,我必须为我的Rest Controller编写Junit测试用例,但是我没有从应该从哪里开始。任何帮助将非常感激。测试Spring Boot Rest API Post方法

这是My Rest Controller类。

@RestController 
public class RecognitionController { 

    private FrameDecoder frameDecoder; 
    private TagEncoder tagEncoder; 
    private RecognitionService recognitionService; 

    @Autowired 
    public RecognitionController(FrameDecoder frameDecoder, TagEncoder tagEncoder, 
     RecognitionService recognitionService) { 

     this.frameDecoder = frameDecoder; 
     this.tagEncoder = tagEncoder; 
     this.recognitionService = recognitionService; 
    } 

    /** 
    * 
    * @param take the input as Json Frame and map the output at api/detection Url. 
    * @return List of Json tag in the Http response. 
    */ 
    @RequestMapping(value = "/api/detection", method = RequestMethod.POST) 
    public List<JsonTag> analyseframe(@RequestBody JsonFrame frame) { 
     SimpleFrame simpleFrame = frameDecoder.decodeFrame(frame); 
     List<OrientedTag> orientedTags = recognitionService.analyseFrame(simpleFrame); 
     return tagEncoder.encodeTag(orientedTags); 
    } 
} 

回答

1

为了测试休息控制器,您需要:

  1. 的JUnit
  2. 的Mockito
  3. 弹簧试验
  4. JsonPath

控制器:

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.*; 

import java.util.ArrayList; 
import java.util.List; 

@RestController 
@RequestMapping(value = "/Entity") 
public class EntityRestController { 

    private EntityService service; 

    @RequestMapping(value = "/entity/all", method = RequestMethod.GET) 
    public List<Entity> findAll() { 
     List<Entity> models = service.findAll(); 
     return createEntities(models); 
    } 

    private List<EntityDTO> createDTOs(List<Entity> models) { 
     List<EntityDTO> dtos = new ArrayList<>(); 

     for (Entitymodel: models) { 
      dtos.add(createDTO(model)); 
     } 

     return dtos; 
    } 

    private EntityDTO createDTO(Entity model) { 
     EntityDTO dto = new EntityDTO(); 

     dto.setId(model.getId()); 
     dto.setDescription(model.getDescription()); 
     dto.setTitle(model.getTitle()); 

     return dto; 
    } 
} 

测试例如:

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 
import org.springframework.test.context.web.WebAppConfiguration; 
import org.springframework.test.web.servlet.MockMvc; 

import java.util.Arrays; 

import static org.hamcrest.Matchers.*; 
import static org.mockito.Mockito.*; 
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; 
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {TestContext.class, WebAppContext.class}) 
@WebAppConfiguration 
public class EntityRestControllerTest { 

    private MockMvc mockMvc; 

    @Autowired 
    private EntityService entityServiceMock; 

    //Add WebApplicationContext field here. 

    //The setUp() method is omitted. 

    @Test 
    public void findAllEntitiesTest() throws Exception { 
     Entity first = new Entity(); 
     first.setId(1L); 
     first.setDescription("Lorem ipsum") 
     first.setTitle("Foo"); 

     Entity second = new Entity(); 
     second.setId(2L); 
     second.setDescription("Lorem ipsum") 
     second.setTitle("Bar"); 

     when(entityServiceMock.findAll()).thenReturn(Arrays.asList(first, second)); 

     mockMvc.perform(get("/entity/all")) 
       .andExpect(status().isOk()) 
       .andExpect(content().contentType(TestUtil.APPLICATION_JSON_UTF8)) 
       .andExpect(jsonPath("$", hasSize(2))) 
       .andExpect(jsonPath("$[0].id", is(1))) 
       .andExpect(jsonPath("$[0].description", is("Lorem ipsum"))) 
       .andExpect(jsonPath("$[0].title", is("Foo"))) 
       .andExpect(jsonPath("$[1].id", is(2))) 
       .andExpect(jsonPath("$[1].description", is("Lorem ipsum"))) 
       .andExpect(jsonPath("$[1].title", is("Bar"))); 

     verify(entityServiceMock, times(1)).findAll(); 
     verifyNoMoreInteractions(entityServiceMock); 
    } 
} 

请遵循full tutorial了解更多详情。

___EDIT_1___

我没有从那里 “thenReturn” 方法来了解

Mockito.when()具有以下签名的静态方法:

public static <T> OngoingStubbing<T> when(T methodCall) 

当你嘲笑一些服务并将其作为参数放入when中t返回的对象是IS OngoingStubbing<T>。所有执行OngoingStubbing<T>的类都有thenReturn(T value)方法,并且它被调用。

+0

谢谢你的答案@ J-Alex,但我不明白从哪里“然后返回”方法来了,请你解释一下,这对我真的很有帮助。 – Vidhi