用@InjectMocks注释的对象上的SpringBoot单元测试注入属性

用@InjectMocks注释的对象上的SpringBoot单元测试注入属性,spring,unit-testing,spring-boot,junit,mockito,Spring,Unit Testing,Spring Boot,Junit,Mockito,我有一个处理jwt创建的类: public class JwtTokenHandler { @Value("${jwtSecret}") private String jwtSecret; @Value("${jwtExpirationInMs}") private int jwtExpirationInMs; public String generateToken(String subject) { Date now = new Da

我有一个处理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();
    }
}
它从resources文件夹中的属性文件中获取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();
    }

我建议研究注释,而不是
@InjectMocks
。用它来伪造豆子要容易得多。

AFAIK,这个“变通方法”就是这样做的。如果没有任何其他类依赖项,则不需要
@injectmock
。Injection只在spring管理的bean中发生。这里使用的实例是由mockito而不是spring创建的,因此不会注入任何内容。如果您想测试该类,请自行设置属性并编写相应的测试,或者使用Spring来引导该类而不是mockito。您也不需要
@RuNWith
,因为它不在这里添加任何内容,而不需要
@InjectMocks
,因为您可以简单地创建自己的实例。