我有一个扩展Spring的CSRF存储库的类,我在其中编写了一个自定义实现。它看起来有点像这样:
public class CustomCookieCsrfTokenRepository implements CsrfTokenRepository {
@Autowired
JWKRepository jWKRepository;
JWK jWK;
@PostConstruct
public void init() {
jWK = jWKRepository.findGlobalJWK(null); // This is custom code, there will always be a valid object returned here
}
@Override
public void saveToken(CsrfToken token, HttpServletRequest request, HttpServletResponse response) {
String tokenValue = token == null ? "" : token.getToken();
log.info("JWK: " + jWK.getPrivateKey());
// other logics
}
}
在我的测试中,我做了这样的事情:
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {CustomCookieCsrfTokenRepositoryTest.class, CustomCookieCsrfTokenRepositoryTest.TestConfig.class })
public class CustomCookieCsrfTokenRepositoryTest {
@TestConfiguration
static class TestConfig {
@Bean
CustomCookieCsrfTokenRepository customCookieCsrfTokenRepository() {
return new CustomCookieCsrfTokenRepository();
}
}
@Autowired
CustomCookieCsrfTokenRepository customCookieCsrfTokenRepository;
@MockBean
HttpServletRequest request;
@MockBean
HttpServletResponse response;
@MockBean
RSAUtil rsaUtil;
@MockBean
JWKRepository jWKRepository;
@MockBean
JWK jWK;
@Test
public void saveToken() {
CsrfToken csrfToken = customCookieCsrfTokenRepository.generateToken(request);
String privateKey = "some key value";
when(jWK.getPrivateKey()).thenReturn(privateKey);
customCookieCsrfTokenRepository.saveToken(csrfToken, request, response);
// some asserts
}
}
所以基本上,当我尝试执行jWK.getPrivateKey()
时,相同的令牌测试用例实际上被破坏了,说有一个 NullPointer 。我试图检查jWK
是否是空对象,但事实并非如此。我已经通过更改日志以打印jWK
对象进行了验证,并且没有抛出任何错误。但是,我正在尝试在我的测试用例中模拟并返回jWK
对象。为什么这不起作用?上面的代码有什么问题?任何帮助将不胜感激。
几件事:
1( JWK 字段不是@Autowired
字段,因此@MockBean
不会对其进行处理。我们需要在测试中对该字段使用简单的@Mock
。
2(在@PostConstruct
中,它是根据jWKRepository.findGlobalJWK(null)
的结果分配的。
3(我们需要模拟这种方法:
@Before
private void init(){
MockitoAnnotations.initMocks(this);
}
@Mock
JWK jWK;
@Test
public void saveToken() {
when(jWKRepository.findGlobalJWK(null)).thenReturn(jWK);
...
}