首页 > 解决方案 > SpringBoot 单元测试在使用 @InjectMocks 注释的对象上注入属性

问题描述

我有一个处理 jwt 创建的类:

public class JwtTokenHandler {
    @Value("${jwtSecret}")
    private String jwtSecret;

    @Value("${jwtExpirationInMs}")
    private int jwtExpirationInMs;

    public String generateToken(String subject) {
        Date now = new Date();
        Date expiryDate = new Date(now.getTime() + jwtExpirationInMs);

        return Jwts.builder()
                .setSubject(subject)
                .setIssuedAt(new Date())
                .setExpiration(expiryDate)
                .signWith(SignatureAlgorithm.HS512, jwtSecret)
                .compact();
    }
}

它从位于资源文件夹中的属性文件中获取jwtSecretjwtExpirationInMs

在我的单元测试中,我只想测试这个类是否按预期工作并生成 JWT 令牌,我面临的问题是,即使我在test/resources中有另一个属性文件,当我运行测试时这两个属性也不会被注入文件夹。

我发现有使用ReflectionTestUtils.setField的解决方案,但它更像是一种解决方法。

我的单元测试如下所示:

@RunWith(SpringRunner.class)
public class JwtTokenProviderTest {

    @InjectMocks
    private JwtTokenProvider jwtTokenProvider;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testGenerateToken() {
        String result = jwtTokenProvider.generateToken("Test");
        assertThat(result).isNotBlank();
    }

标签: springunit-testingspring-bootjunitmockito

解决方案


而不是@InjectMocks,我建议查看Spring Boot 的@MockedBean注释。用它来伪造豆子要容易得多。


推荐阅读