MvcResult имеет статус 200, включая ответ, но утверждение не выполнено - PullRequest
0 голосов
/ 21 июня 2019

В настоящее время я пишу тестовый пример JUnit для контроллера в моем приложении, которое возвращает объект (URL). Я пытаюсь утверждать, что ожидаемый и фактический URL совпадают. Когда я проверяю результат MvcResult, происходит 2 вещи:

  1. mockResponse имеет код состояния 200.

  2. В ModelAndView модель имеет ожидаемое значение URL, но когда я пытаюсь подтвердить результат с помощью result.getResponse().getContentAsString(), утверждение не выполняется, так как результат пуст.

Что я уже пробовал:

  1. Во время отладки я вижу, как элемент управления перемещается в службу, что означает, что значения были должным образом смоделированы и ожидаемый URL-адрес был возвращен результату (как он присутствовал в ModelAndView при проверке).

  2. Я попытался дать ожидаемый URL-адрес в виде объекта json, использовал средство отображения объектов для его чтения, а затем попытался выполнить JSONAssert, но результат все еще пуст.

    @RunWith(SpringJUnit4ClassRunner.class)
    public class StudentControllerTest {
    
      private static final String CACHE_URL= "cacheurl";
    
      @Mock
      StudentCacheService studentCacheService; 
    
      @InjectMocks
      StudentCacheController studentCacheController;
    
      private MockMvc mockMvc;
    
      @Before
      public void setUp() throws Exception {
      mockMvc = MockMvcBuilders.standaloneSetup(studentCacheController).build();
      }
    
      @Test
      public void testGetScoresUrl() throws Exception {
      Mockito.when(studentCacheService.getStudentUrl("123", "science"))
            .thenReturn(new StudentUrl(CACHE_URL));
      MvcResult result = this.mockMvc.perform(MockMvcRequestBuilders.get("/student/123/scores")
            .header("subject", "science").contentType(MediaType.APPLICATION_JSON)).andExpect(status().is2xxSuccessful())
            .andReturn();
      Assert.assertEquals(CACHE_URL, result.getResponse().getContentAsString());
      }
    } 
    

Мой класс контроллера выглядит следующим образом:

@Controller
@RequestMapping("/student")
public class StudentCacheController {
   @Autowired
   StudentCacheService studentCacheService;

   @GetMapping(path = "/{studentId}/scores",produces = MediaType.APPLICATION_JSON_VALUE)
   public StudentUrl getScores(@PathVariable String studentId, @RequestHeader(value = "subject", required = true) String subject) throws Exception {
    return studentCacheService.getStudentUrl(studentId, subject);
 }
}

Ответ следующий:

MockHttpServletResponse:
      Status = 200
      Error message = null
      Forwarded URL = student/123/scores
      Included URL = []

ModelAndView:
      model = ModelMap
        key = studentUrl
        value = StudentUrl
           url = "cacheurl" 

Я получаю эту ошибку: org.junit.ComparisonFailure: expected:<[cacheurl]> but was:<[]>

Любая помощь приветствуется. Спасибо!

...