Как исправить не вошедшую в систему ошибку при тестировании? - PullRequest
0 голосов
/ 14 января 2019

Я пишу несколько тестов для моего API. API отвечает только тогда, когда пользователь вошел в систему. Я написал тест для API входа в систему, и это работает, однако после запуска этого теста другие тесты не работают, потому что пользователь не вошел в систему.

Код для проверки логина (работает):

public class FunctionalTest {

@BeforeClass
public static void setup() {
    String port = System.getProperty("server.port");
    if (port == null) {
        RestAssured.port = Integer.valueOf(8080);
    }
    else{
        RestAssured.port = Integer.valueOf(port);
    }


    String basePath = System.getProperty("server.base");
    if(basePath==null){
        basePath = "/";
    }
    RestAssured.basePath = basePath;

    String baseHost = System.getProperty("server.host");
    if(baseHost==null){
        baseHost = "http://localhost";
    }
    RestAssured.baseURI = baseHost;
}
}

public class RestEndpointTests extends FunctionalTest{

//User control <---- WORKS
@Test
public void checkLogin(){
    given()
            .param("email", "123")
            .param("username", "123")
            .param("password", "123")
            .post("/login")
            .then()
            .statusCode(200);
}


//Playlists   <---- DOES NOT WORK
@Test
public void checkPlaylistById() {
    given().when().get("/playlists/1").then()
            .body("name",equalTo("Playlist 1"));
}

Как решить эту проблему и кодировать пользователя, который будет входить в систему при выполнении checkPlaylistByID?

Заранее спасибо!

1 Ответ

0 голосов
/ 14 января 2019

Вы можете настроить пользователя для теста. Как вы это сделаете, зависит от того, как работает ваш уровень безопасности. Вот как я бы поступил для Spring MVC с Spring Security:

@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 Security, и SecurityContextHolder будет удерживать пользователя, чтобы его мог получить протестированный метод. .

Метод, который вы тестируете, может получить этого пользователя с помощью:

SecurityContextHolder.getContext().getAuthentication().getPrincipal()

Если вы не сделали такой вызов, вы можете просто положиться на MockMvc и вообще не устанавливать зарегистрированного пользователя.

Здесь я явно устанавливаю зарегистрированного пользователя для каждого теста, но использование вашей инфраструктуры тестирования избавит вас от необходимости делать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...