我有一个类扩展了Spring的CSRF存储库,并在其中编写了自定义实现。看起来像这样:
trial::coords
在测试中,我会执行以下操作:
// still need the first `trial::`, but the one on `coords` is inferred
auto trial::function(vector <double> x1, vector <double> x2) -> vector<coords> {
...
}
因此,基本上,同一令牌测试用例实际上被破坏了,说我尝试做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
}
}
时有一个NullPointer。我试图检查@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()
对象进行验证,它没有引发任何错误。但是,我正在尝试模拟并返回测试用例中的jWK
对象。为什么不起作用?上面的代码有什么问题?任何帮助将不胜感激。
答案 0 :(得分:2)
这里有几件事:
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);
...
}