模拟类永远不会在运行测试时始终提供Null指针

时间:2019-07-15 06:50:40

标签: java spring unit-testing junit mockito

我有一个类扩展了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对象。为什么不起作用?上面的代码有什么问题?任何帮助将不胜感激。

1 个答案:

答案 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);
    ...
}