我正在尝试使用junit 5和mocking为我的SPRING-BOOT CRUD操作项目的控制器编写测试。运行测试时,显示以下错误。不明白是什么问题。
错误:-
10:24:51.840 [main] INFO org.springframework.test.web.servlet.TestDispatcherServlet -- Initializing Servlet ''
10:24:51.842 [main] INFO org.springframework.test.web.servlet.TestDispatcherServlet -- Completed initialization in 1 ms
10:24:51.865 [main] WARN org.springframework.web.servlet.PageNotFound -- No mapping for GET /content
java.lang.AssertionError: No value at JSON path "$.duration"
字符串
ContentController文件:-
package com.example.sixth.controller;
import com.example.sixth.entity.Content;
import com.example.sixth.service.ContentService;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;
@RestController
public class ContentController {
private final ContentService contentService;
public ContentController(ContentService contentService) {
this.contentService = contentService;
}
@GetMapping("/content")
public List<Content> show(){
return contentService.showAll();
}
@PostMapping("/content")
public String save(@RequestBody Content content){
return contentService.save(content);
}
@GetMapping("/content/title/{param}")
public List<Content> getContentStartWith(@PathVariable("param") String title){
return contentService.getContentStartWith(title);
}
@DeleteMapping("/content/{id}")
public String delete(@PathVariable Integer id){
return contentService.delete(id);
}
@GetMapping("/id")
public List<Content>getById(@RequestParam Integer minId,
@RequestParam Integer maxId){
return contentService.getById(minId,maxId);
}
@GetMapping("/content/{id}")
public Optional<Content> findById(@PathVariable Integer id){
return contentService.findById(id);
}
}
型
测试文件:-
package com.example.sixth;
import com.example.sixth.controller.ContentController;
import com.example.sixth.entity.Content;
import com.example.sixth.service.ContentService;
import com.example.sixth.service.ContentServiceImpl;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MockMvcBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
//import org.powermock.api.mockito.PowerMockito;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import static org.hamcrest.Matchers.is;
import static org.junit.jupiter.api.Assertions.assertEquals;
@AutoConfigureMockMvc
//@SpringBootTest
public class ContentControllerTest {
@Autowired
MockMvc mockMvc;
@Mock
ContentService mockService;
@InjectMocks
ContentController contentController;
@BeforeEach
public void init(){
MockitoAnnotations.initMocks(this);
this.mockMvc= MockMvcBuilders.standaloneSetup(mockService).build();
}
@Test
public void testfindall() throws Exception {
Content content = (Content.builder()
.id(3)
.title("SECOND!!")
.duration(38)
.location("Bangalore").build());
List<Content> contentList = new ArrayList<>();
contentList.add(content);
Mockito.when(mockService.showAll()).thenReturn(contentList);
mockMvc.perform(MockMvcRequestBuilders.get("/content").contentType(MediaType.APPLICATION_JSON)).andExpect(MockMvcResultMatchers.jsonPath("$.duration",is(content.getDuration())));
// List<Content> actual=contentController.show();
// System.out.println(actual.get(0).toString());
// assertEquals(actual,contentList);
}
型
顺便说一句,当使用assert时,它可以工作,但使用mockMvc时,它显示错误。
1条答案
按热度按时间xlpyo6sf1#
正如注解中所讨论的,您正在尝试为单个控制器编写单元测试。
@WebMvcTest是这项工作的正确工具。
1.使用@WebMvcTest(Content controller.class)注解您的测试,它将使用应用程序的web切片创建spring上下文。
1.您需要提供缺少的bean,以便spring可以创建控制器的示例。这些是通过@MockBean提供的,而不是@Mock
1.最后,您有WebMvcTest提供的MockMvc示例(该注解使用@AutoConfigureWebMvc注解),并使用@Autowired注入到测试中。您正在用@BeforeEach中的另一个错误配置的示例覆盖此示例。除此之外,您还覆盖了模拟。这就是为什么需要删除整个BeforeEach的原因。
使用@WebMvcTest进行单元测试