繁体   English   中英

我如何用 Mockito 模拟 jwt

[英]How do I mock a jwt with Mockito

我在 controller 中有这段代码片段可以在 quarkus 中进行测试:

@Context 
private SecurityContext securityContext;
....
JsonWebToken jsonWebToken = (JsonWebToken) securityContext.getUserPrincipal();
if(!AuthorizationHelper.checkJwt(jsonWebToken)) {
    return Response.status(Response.Status.UNAUTHORIZED).build();
}

AuthorizationHelper是一个带有@Singleton注解的class,checkJwt()方法如下所示:

public static boolean checkJwt(JsonWebToken jsonWebToken) {
    return jsonWebToken!=null&&jsonWebToken.getName()!=null;
} 

这就是我写的:

@Test
public void testGetUsers() {
    Mockito.when(AuthorizationHelper.checkJwt(Mockito.any(JsonWebToken.class))).thenReturn(true);
    given()
            .when().get("/api/v1/users")
            .then()
            .statusCode(200);
}

它抱怨说“你不能在验证或存根之外使用参数匹配器。”

我确实尝试模拟 SecurityContext class,并让它返回我创建的 jwt,尽管我初始化了 jwt,当它出现 securityContext.getPrincipal() 时它会返回 null。

AuthorizationHelper.checkJwt是一个 static 方法调用。 Mocking 这在 mockito 中的工作方式不同。根据mockito 文档

assertEquals("foo", Foo.method());
try (MockedStatic mocked = mockStatic(Foo.class)) {
    mocked.when(Foo::method).thenReturn("bar");
    assertEquals("bar", Foo.method());
    mocked.verify(Foo::method);
}
assertEquals("foo", Foo.method());

在你的情况下,你需要照顾 arguments 并做这样的事情(尚未测试):

    mocked.when(() -> AuthorizationHelper.checkJwt(Mockito.any(JsonWebToken.class))).thenReturn(true);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM