当前位置: 首页 > 知识库问答 >
问题:

模拟JWT UTIL以验证令牌

夏英发
2023-03-14

我想为此endpoint创建JUnkt测试:

    @Autowired
    private JwtTokenProvider jwtTokenProvider;

    @PostMapping("reset_token")
    public ResponseEntity<?> resetToken(@Valid @RequestBody ResetPasswordTokenDTO resetPasswordTokenDTO, BindingResult bindResult) {

        final String login = jwtTokenProvider.getUsername(resetPasswordTokenDTO.getResetPasswordToken());
    }

完整代码:Github

JUnit测试:

@Test
public void resetTokenTest_NOT_FOUND() throws Exception {
    when(usersService.findByResetPasswordToken(anyString())).thenReturn(Optional.empty());

    mockMvc.perform(post("/users/reset_token")
            .contentType(MediaType.APPLICATION_JSON)
            .content(ResetPasswordTokenDTO))
            .andExpect(status().isNotFound());
}

当我运行代码时,我在这一行得到NPE:

final String login = jwtTokenProvider.getUsername(resetPasswordTokenDTO.getResetPasswordToken());

我如何正确地模拟jwtTokenProvider?正如你所见,我有一个包含测试数据的文件,我加载了该文件,但没有提取令牌。你知道我如何解决这个问题吗?

共有2个答案

督德明
2023-03-14

您可以考虑直接在测试类中使用@MockBean来模拟您的JwtTokenProvider。@MockBean注释是Spring式的,包含在Spring-boo-starter-test中。Spring Boot留档总结得很好:

Spring Boot包含@MockBean注释,可用于为ApplicationContext中的bean定义Mockito mock。可以使用注释添加新bean或替换单个现有bean定义。注释可以直接用于测试类、测试中的字段或@Configuration类和字段。在字段上使用时,还将注入已创建模拟的实例。模拟bean在每个测试方法之后都会自动重置。

@MockBean注释将使Spring在其应用程序上下文中查找类型为JwtTokenProvider的现有单个bean。如果存在,mock将替换该bean,如果不存在,则在应用程序上下文中添加新的mock。

您的测试类将如下所示:

import org.springframework.boot.test.mock.mockito.MockBean;

@MockBean
@Qualifier("xxx") //If there is more than one bean of type JwtTokenProvider
private JwtTokenProvider jwtTokenProvider;

@Test
public void resetTokenTest_NOT_FOUND() throws Exception {

    when(jwtTokenProvider.getUsername(anyString())).thenReturn(Optional.empty());

    mockMvc.perform(post("/users/reset_token")
            .contentType(MediaType.APPLICATION_JSON)
            .content(ResetPasswordTokenDTO))
            .andExpect(status().isNotFound());
}

你可能还想检查这个和这个。

楮乐邦
2023-03-14

最直接的方法是使用Mockito并创建mock实例,然后使用构造函数注入将其直接传递给控制器类。

然而,如果您不希望使用构造函数注入(我建议您使用它,因为它更显式),那么您需要在单独的测试配置类中定义bean


@Profile("test")
@Configuration

public class TestConfiguration {
    @Bean
    public JwtTokenProvider mockJwtTokenProvider() {
        return Mockito.mock(JwtTokenProvider.class);
    }

}

另外,通过@ActiveProfile("test")将正确的配置文件添加到您的测试类中

 类似资料:
  • 我在spring中有一个API示例,它提供了一些服务,我正试图用OAuth2保护它们。 当我使用时,具有安全性的API似乎以某种方式工作,但现在我的所有测试都失败了,因此,我正在查看丢失的如何模拟安全性的示例。 我目前正在尝试使这个示例运行(策略#1)http://engineering.pivotal.io/post/faking_oauth_sso/ 这应该很容易,但出于某种原因,我遇到了一些

  • 我正在训练一个数据集,然后在其他数据集上测试它。

  • 通过令牌验证在注册中心控制权限,以决定要不要下发令牌给消费者,可以防止消费者绕过注册中心访问提供者,另外通过注册中心可灵活改变授权方式,而不需修改或升级提供者 可以全局设置开启令牌验证: <!--随机token令牌,使用UUID生成--> <dubbo:provider interface="com.foo.BarService" token="true" /> 或 <!--固定token令牌,

  • 问题内容: 我试图弄清楚如何对我的控制器的URL进行适当安全的单元测试。以防万一有人更改周围的内容并意外删除安全设置。 我的控制器方法如下所示: 我像这样设置一个WebTestEnvironment: 在我的实际测试中,我尝试执行以下操作: JUnit如何测试@PreAuthorize批注及其由spring MVC控制器指定的spring EL? 但是,如果仔细观察,这仅在不向URL发送实际请求时

  • 我正在处理一个Spring Boot java服务,该服务包含一个Camel处理器类,如下所示: 当我运行它时,我得到一个失败,声明对1*LogService.Update(_)的调用太少(0个调用)。我试着调试代码,在MyProc中,语句被命中,并且logService对象在高亮显示时(在Eclipse中)状态为“mock for type logService named$spock_shar

  • 问题内容: 我在CSRF令牌方面遇到问题。当我提交表单时,正在生成一个新的表单,但是我想我正在生成两个不同的令牌,这有点困惑。还有一个名为的令牌,因此我在开发人员工具中看到了两个不同的cookie(XSRF- TOKEN和_csrf),发布后它们没有变化。 我想要做的是为每个帖子请求生成一个新令牌,并检查它是否有效。我知道为了安全起见应该这样做,但是我坚持了下来。 漫长的一天,我是Express和