模拟类在运行测试时从不总是给出空指针



我有一个扩展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);
    ...
}

相关内容

  • 没有找到相关文章