spring - 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();
}
}
它从位于资源文件夹中的属性文件中获取jwtSecret和jwtExpirationInMs。
在我的单元测试中,我只想测试这个类是否按预期工作并生成 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
,我建议查看Spring Boot 的@MockedBean
注释。用它来伪造豆子要容易得多。
推荐阅读
- sql-server - 如何在 SQL 函数中计算不同的趋势线类型
- typescript - 使用 WebCrypto API 使用从字符串生成的加密密钥加密/解密数据
- android - 我想注销用户并将他发送到另一个活动
- javascript - Ember 在生产环境中的脚本标签中添加应用程序名称
- javascript - 引导模型弹出窗口中的 daterangepicker NotWorking
- php - ng-blur 动作没有被触发
- eclipse - IDE 有没有统一的键盘快捷键解决方案,比如 Eclipse、IntellJ、JDeveloper……所以我不需要记住那么多快捷键?
- wpf - 将 UserControl 绑定到 ViewModel (Caliburn Micro WPF)
- angular - 注销时自动隐藏侧边菜单
- c# - 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder 找不到任何构造函数