java.lang.AssertionError : Response content

标签 java unit-testing spring-boot

我正在尝试测试 UnitTest 但收到 java.lang.AssertionError: Response content 运行测试时。
我的Logcat

java.lang.AssertionError: Response content
Expected: <[UserDTO [firstName=Ahmad, lastName=shahzad, userName=1, emailAddress=ahmad.shahzad@null], UserDTO [firstName=Jamshaid, lastName=iqbal, userName=2, emailAddress=jamshaid.ali@null], UserDTO [firstName=Waqas, lastName=Akram, userName=3, emailAddress=waqas.akram@null]]>
 but: was "[{\"firstName\":\"Ahmad\",\"lastName\":\"shahzad\",\"userName\":\"1\",\"emailAddress\":\"ahmad.shahzad@null\"},{\"firstName\":\"Jamshaid\",\"lastName\":\"iqbal\",\"userName\":\"2\",\"emailAddress\":\"jamshaid.ali@null\"},{\"firstName\":\"Waqas\",\"lastName\":\"Akram\",\"userName\":\"3\",\"emailAddress\":\"waqas.akram@null\"}]"
Expected :<[UserDTO [firstName=Ahmad, lastName=shahzad, userName=1, emailAddress=ahmad.shahzad@null], UserDTO [firstName=Jamshaid, lastName=iqbal, userName=2, emailAddress=jamshaid.ali@null], UserDTO [firstName=Waqas, lastName=Akram, userName=3, emailAddress=waqas.akram@null]]>
Actual   :"[{\"firstName\":\"Ahmad\",\"lastName\":\"shahzad\",\"userName\":\"1\",\"emailAddress\":\"ahmad.shahzad@null\"},{\"firstName\":\"Jamshaid\",\"lastName\":\"iqbal\",\"userName\":\"2\",\"emailAddress\":\"jamshaid.ali@null\"},{\"firstName\":\"Waqas\",\"lastName\":\"Akram\",\"userName\":\"3\",\"emailAddress\":\"waqas.akram@null\"}]"

at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
at org.springframework.test.web.servlet.result.ContentResultMatchers.lambda$string$3(ContentResultMatchers.java:130)
at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:195)

UnitTestCase类

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class UnitTestAuth {
@Autowired
public MockMvc mvc;

@Test
public void getHello() throws Exception {
    mvc.perform(MockMvcRequestBuilders.get("/auth").accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(content().string(equalTo(new UserController().getUsers())));
}


}

Controller 类

@RestController
@RequestMapping("/auth")
public class UserController {

private static final Logger LOGGER = Logger.getLogger(UserController.class.getName());

@Value("${mail.domain ?: google.com}")
private static String mailDomain;

private List<UserDTO> users = Arrays.asList(new UserDTO("Ahmad", "shahzad", "1", "ahmad.shahzad@" + mailDomain),
        new UserDTO("Jamshaid", "iqbal", "2", "jamshaid.ali@" + mailDomain),
        new UserDTO("Waqas", "Akram", "3", "waqas.akram@" + mailDomain));


@RequestMapping(method = RequestMethod.GET, headers = "Accept=application/json")
public List<UserDTO> getUsers() {
    return users;
}

@RequestMapping(value = "{userName}", method = RequestMethod.GET, headers = "Accept=application/json")
public UserDTO getUserByUserName(@PathVariable("userName") String userName) {
    UserDTO userDtoToReturn = null;
    for (UserDTO currentUser : users) {
        if (currentUser.getUserName().equalsIgnoreCase(userName)) {
            userDtoToReturn = currentUser;
            if (LOGGER.isLoggable(Level.INFO)) {
                LOGGER.info(String.format("Found matching user: %s", userDtoToReturn.toString()));
            }
            break;
        }
    }

    return userDtoToReturn;
}
}

Problem: I am unable to get how should I match those both string in order to get the test passed. Thanks for your help.

最佳答案

在您的情况下,您需要使用 json() 而不是 string(),因为您的响应会在内部转换为 JSON。并使用 com.fasterxml.jackson.databind.ObjectMapper 中的 ObjectMapper 将您的响应列表转换为 JSON。

@Test
public void getHello() throws Exception {
ObjectMapper mapper = new ObjectMapper();
String result = mapper.writeValueAsString(new UserController().getUsers());
    mvc.perform(MockMvcRequestBuilders.get("/auth").accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(content().json(result));
}

编辑:您可以使用 ObjectMapper 将对象列表转换为 JSON。

关于java.lang.AssertionError : Response content,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57305684/

相关文章:

Java同时打印两行

java - Tomcat 无法在 Mac 上运行

java - 如何正确模拟 WebSocket session ?

java - Maria DB 通信链接失败异常

java - Spring - 如何在部分 View 中访问对象

具有长类型_id的java mongodb findOne

java - 如何在显示之前设置 JavaFX 警报对话框位置?

c# - 如何使用异步调用对 Prism INavigationAware.OnNavigatedTo 进行单元测试

java - 如何处理 org.mockito.exceptions.misusing.MissingMethodInitationException?

java - 我的 CustomDeserializer 类在同一类的第二个字段上第二次不起作用