Java 模拟JWT UTIL以验证令牌

Java 模拟JWT UTIL以验证令牌,java,spring,junit,junit5,spring-test,Java,Spring,Junit,Junit5,Spring Test,我想为此端点创建JUnkt测试: @Autowired private JwtTokenProvider jwtTokenProvider; @PostMapping("reset_token") public ResponseEntity<?> resetToken(@Valid @RequestBody ResetPasswordTokenDTO resetPasswordTokenDTO, BindingResult bin

我想为此端点创建JUnkt测试:

    @Autowired
    private JwtTokenProvider jwtTokenProvider;

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

        final String login = jwtTokenProvider.getUsername(resetPasswordTokenDTO.getResetPasswordToken());
    }
当我运行代码时,我在这一行得到NPE:

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

我怎样才能恰当地嘲笑?如您所见,我有一个带有test的文件,我加载了该文件,但没有提取令牌。您知道如何解决此问题吗?

最简单的方法是使用和创建模拟实例,并使用构造函数注入将其直接传递给控制器类

但是,如果您不希望使用构造函数注入,我建议您使用它,因为它更明确,您需要在单独的测试配置类中定义bean

@轮廓测试 @配置 公共类测试配置{ @豆子 公共JwtTokenProvider mockJwtTokenProvider{ 返回Mockito.mockJwtTokenProvider.class; } }
另外,通过@ActiveProfilestest将正确的概要文件添加到测试类中最简单的方法是使用和创建模拟实例,并使用构造函数注入将其直接传递给控制器类

但是,如果您不希望使用构造函数注入,我建议您使用它,因为它更明确,您需要在单独的测试配置类中定义bean

@轮廓测试 @配置 公共类测试配置{ @豆子 公共JwtTokenProvider mockJwtTokenProvider{ 返回Mockito.mockJwtTokenProvider.class; } }

也可以通过@ ActuvPrimeLestest

< P>将正确的配置文件添加到测试类中,您可以考虑在测试类中直接使用@ McCiBek来模拟JWTtokValvor。注释是Spring ish,包含在Spring boot starter测试中。报告很好地总结了这一点:

Spring Boot包含一个@MockBean注释,可用于定义 应用程序上下文中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());
}

您可能还想检查和./p>< p>您可以考虑在测试类中直接使用@ McCiBek来模拟JWTtokValvor。注释是Spring ish,包含在Spring boot starter测试中。报告很好地总结了这一点:

Spring Boot包含一个@MockBean注释,可用于定义 应用程序上下文中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());
}

您可能还想检查和。

我需要将这个Java类放在哪里?是否有其他方法将其实现到JUnit类文件中?您也可以将它放在测试文件中。或者像我前面说的那样,使用构造函数注入。还有其他解决方案吗?@PeterPenzov您是否首先使用whenmock.something.thenReturn…,在返回的模拟中设置存根,并验证是否使用正确的值命中模拟。模拟对象在默认情况下返回null,任何链接调用都可能会在我需要放置该Java类的行上失败?是否有其他方法将其实现到JUnit类文件中?您也可以将其放置在与测试相同的文件中。或者像我前面说的那样,使用构造函数注入。还有其他解决方案吗?@PeterPenzov您是否首先使用whenmock.something.thenReturn…,在返回的模拟中设置存根,并验证是否使用正确的值命中模拟。模拟对象在默认情况下返回null,任何链接调用都可能会失败