java.lang.AssertionError:响应内容

java.lang.AssertionError:响应内容,java,unit-testing,spring-boot,Java,Unit Testing,Spring Boot,我试图测试UnitTest,但得到java.lang.AssertionError:Response内容 运行测试时。 我的日志猫 java.lang.AssertionError: Response content Expected: <[UserDTO [firstName=Ahmad, lastName=shahzad, userName=1, emailAddress=ahmad.shahzad@null], UserDTO [firstName=Jamshaid, lastNam

我试图测试
UnitTest
,但得到
java.lang.AssertionError:Response内容
运行测试时。
我的日志猫

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\"}]"
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())));
}


}
@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;
}
}
控制器类

@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())));
}


}
@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;
}
}
@RestController
@请求映射(“/auth”)
公共类用户控制器{
私有静态最终记录器Logger=Logger.getLogger(UserController.class.getName());
@值(${mail.domain?:google.com})
私有静态字符串域;
私有列表用户=Arrays.asList(新用户dto(“Ahmad”、“shahzad”、“1”、“Ahmad.shahzad@”+mailDomain),
新用户dto(“Jamshaid”、“iqbal”、“2”、“Jamshaid.ali@”+mailDomain),
新用户DTO(“Waqas”、“Akram”、“3”、“Waqas.Akram@”+mailDomain));
@RequestMapping(method=RequestMethod.GET,headers=“Accept=application/json”)
公共列表getUsers(){
返回用户;
}
@RequestMapping(value=“{userName}”,method=RequestMethod.GET,headers=“Accept=application/json”)
公共用户数据到getUserByUserName(@PathVariable(“用户名”)字符串用户名){
UserDTO userDtoToReturn=null;
for(UserDTO当前用户:用户){
if(currentUser.getUserName().equalsIgnoreCase(用户名)){
userDtoToReturn=当前用户;
if(LOGGER.isLoggable(Level.INFO)){
LOGGER.info(String.format(“找到匹配的用户:%s”,userDtoToReturn.toString());
}
打破
}
}
返回userDtoToReturn;
}
}
问题: 我无法获得如何匹配这两个字符串以通过测试。谢谢你的帮助


当调用其
toString()
方法时,您试图将内容字符串与实际对象进行比较,如下所示:

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\"}]"
预期:
但是:是“[{\“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\"}]"
您必须解析内容中的每个属性,或者使用某种JSON解析器进行批量解析。然后将每个解析的属性与用户对象的字段进行比较。

您需要使用
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。

new UserController().getUsers())
返回一个
列表,您试图将其与mvc框架上下文中调用返回的JSON字符串进行比较。我知道,那显然行不通。但是没有找到一种方法来比较它们如何模拟MVCrequestBuilders配置我应该如何使用JSON解析器?你必须弄清楚。关键是,不能在字符串和实际对象上断言等于。toString()。
getUsers()
将返回一个列表。如何将其更改为JSON?它在添加依赖项后解决了错误