【问题标题】:SpringBoot unit test inject properties on object annotated with @InjectMocksSpring Boot 单元测试在使用 @InjectMocks 注释的对象上注入属性
【发布时间】:2019-02-10 23:18:11
【问题描述】:

我有一个处理 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();
    }

【问题讨论】:

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

标签: spring unit-testing spring-boot junit mockito


【解决方案1】:

我建议不要使用@InjectMocks,而是查看Spring Boot's @MockedBean 注释。使用它来伪造 bean 会容易得多。

【讨论】:

    猜你喜欢
    • 2021-11-24
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 2018-11-26
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    相关资源
    最近更新 更多