使用 Jax RS 和 pathParam 进行单元测试

Unit Testing using Jax RS and pathParam

我目前正在编写一个功能,允许用户从大厅开始游戏(有点像我们之间的游戏:所有者点击开始游戏,游戏开始。)

为此,我首先获取带有路径的大厅 ID (=token),然后检查该大厅是否存在以及大厅中的每个人是否都已准备就绪。 如果这两个条件都成立,我 return 只是一个 ok 代码 (200)。

如果我尝试我的失眠请求,它会很好用。我遇到的问题是我想创建单元测试函数来测试这个函数 startGame。

这是我的函数代码:

@GET
    @Path("/{token}/start")
    @Produces(MediaType.TEXT_PLAIN)
    public Response startGame(@PathParam("token") String token) {
        
        if (!sessionsDB.sessionExist(token)){
            return Response.status(Response.Status.UNAUTHORIZED).build();
        }

        if(!userLobbyDB.isEveryoneReady(token)) {
            return Response.status(Response.Status.CONFLICT).build();
        }   
        return Response.ok().build();
    }

还有我的测试函数:

@Test
    public void startGame_Test() {
        // ----------- Init des DB ----------- // 
        
        SessionsDB sessionsDB = SessionsDB.getInstance();
        UserDB userDB = UserDB.getInstance();
        UserInLobbyDB userLobbyDB = UserInLobbyDB.getInstance();
        
        
        // ----------- Création d'une Session ----------- // 
        
        User creator_user = new User("ownerUsername");
        userDB.add_user(creator_user);

        Session newSession = new Session(creator_user.getUser_id()); 
        sessionsDB.add_session(newSession);

        UserInLobby userInLobby = new UserInLobby(creator_user, newSession.getToken());
        userLobbyDB.addUserInLobby(userInLobby);
        
        String token = newSession.getToken();
        
        // ----------- Init des joiners ----------- // 
        
        User joiner1 = new User("joiner1");
        User joiner2 = new User("joiner2");
        User joiner3 = new User("joiner3");
        User joiner4 = new User("joiner4");

        // ----------- Ajout des Joiners à la Session ----------- // 
        
        UserInLobby userInLobbyJoiner1 = new UserInLobby(joiner1, token);
        UserInLobby userInLobbyJoiner2 = new UserInLobby(joiner2, token);
        UserInLobby userInLobbyJoiner3 = new UserInLobby(joiner3, token);
        UserInLobby userInLobbyJoiner4 = new UserInLobby(joiner4, token);
        
        // ----------- Setting them to Ready ----------- // 
        
        userInLobbyJoiner1.setReadyOrNot(1);
        userInLobbyJoiner2.setReadyOrNot(1);
        userInLobbyJoiner3.setReadyOrNot(1);
        userInLobbyJoiner4.setReadyOrNot(1);
        
        userLobbyDB.addUserInLobby(userInLobbyJoiner1);
        userLobbyDB.addUserInLobby(userInLobbyJoiner2);
        userLobbyDB.addUserInLobby(userInLobbyJoiner3);
        userLobbyDB.addUserInLobby(userInLobbyJoiner4);

        
        // ----------- Test que toutes les conditions sont réunis pour pouvoir lancer la game ----------- //
        given().pathParam("token", token)
            .when().get("/{token}/start")
            .then()
                .statusCode(200);
        
    }

这个测试函数的第一部分创建了一个所有者用户和大厅(所以我们得到了这个会话的令牌)并且我创建了一些加入者用户,我只是将它们添加到会话中并将它们设置为就绪.

我知道应该找不到第一个响应或 HTTP 代码,但我更改它以查看我的问题出在哪里。 因为当我尝试构建时,我在这个测试上失败了,它说:“1 期望失败。 预期状态代码 <200> 但为 <404>。"

但我不知道这个错误是从哪里来的。我在任何地方都没有 return 任何未找到的响应(如果只有 returns 是一个布尔值并且在它们的主体中没有响应,这两个函数就是如此)。

一个可能的想法是它没有找到要执行的函数(我的意思是路径有问题,所以我的函数没有被调用)。 但这会很奇怪,因为当我用失眠请求进行测试时,它运行良好。

你有什么想法吗?

非常感谢您花时间阅读本文^^

我已经解决了我的问题,路径有问题,这就是我收到 404 的原因。 谢谢^^