Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修复测试时未登录的错误?_Java_Spring_Api_Testing_Rest Assured - Fatal编程技术网

Java 如何修复测试时未登录的错误?

Java 如何修复测试时未登录的错误?,java,spring,api,testing,rest-assured,Java,Spring,Api,Testing,Rest Assured,我正在为我的API编写一些测试。API仅在用户登录时应答。我已经为登录API编写了一个测试,它可以工作,但是在我运行这个测试之后,其他测试就不能工作了,因为用户没有登录 用于测试登录的代码(works): 公共类功能测试{ @课前 公共静态无效设置(){ String port=System.getProperty(“server.port”); 如果(端口==null){ restasured.port=Integer.valueOf(8080); } 否则{ restasured.port=

我正在为我的API编写一些测试。API仅在用户登录时应答。我已经为登录API编写了一个测试,它可以工作,但是在我运行这个测试之后,其他测试就不能工作了,因为用户没有登录

用于测试登录的代码(works):

公共类功能测试{
@课前
公共静态无效设置(){
String port=System.getProperty(“server.port”);
如果(端口==null){
restasured.port=Integer.valueOf(8080);
}
否则{
restasured.port=Integer.valueOf(端口);
}
字符串basePath=System.getProperty(“server.base”);
if(basePath==null){
basePath=“/”;
}
RestAssured.basePath=basePath;
字符串baseHost=System.getProperty(“server.host”);
if(baseHost==null){
基本主机=”http://localhost";
}
RestAssured.baseURI=baseHost;
}
}
公共类RestEndpointTests扩展了FunctionalTest{

//用户控制您可以为测试设置一个用户。如何设置取决于安全层的工作方式。下面是我如何使用Spring security为Spring MVC设置的:

@Test
public void testStuff() throws Exception {

    UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(USER_LOGIN, USER_PASSWORD);
    SecurityContextHolder.getContext().setAuthentication(authentication);

    restApiNameMockMvc.perform(fileUpload("/api/api_name/stuff")
        .param("param", PARAM_VALUE)
    )
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.testedProperty").value(expectedValue));
}
请注意,我没有调用登录端点,而是将上下文设置为用户已经登录。
MockMvc
不应用Spring安全规则,SecurityContextHolder将保留该用户,以便测试的方法可以获取该用户

您测试的方法可以通过以下方式获得该用户:

SecurityContextHolder.getContext().getAuthentication().getPrincipal()
如果您没有进行这样的调用,您可以依靠MockMvc,而不设置登录用户


在这里,我为每个测试显式地设置登录用户,但利用您的测试框架将使您不必这样做。

为什么您不能简单地进行登录?服务器如何识别登录用户?当用户登录时,我得到一个Xauth令牌。未识别apauthenticationtoken,这是导入吗?我的bad、 这是一个自定义类,是UsernamePasswordAuthenticationToken上的一个层。我已经编辑了我的答案以使用最后一个类。
SecurityContextHolder.getContext().getAuthentication().getPrincipal()