我会通过以下方式之一做到这一点:
- 注入密钥。
- 存根方法调用并在那里设置密钥。
方法一
当我说注入密钥时,我实际上是指注入一个 KeyFactory。这意味着您可以在测试中控制结果。例如:
KeyHolder newCode = injectedKeyFactory.getKeyHolder();
try {
namedParameterJdbcTemplate.update(sql, paramMap, newCode);
} catch (DuplicateKeyException e) {
logger.error("Duplicate Key");
}
data.setId(newCode.getKey().intValue());
然后在测试中:
KeyHolder newCode = mock(KeyHolder.class);
Mockito.when(namedParameterJdbcTemplate.update(Mockito.anyString(), Mockito.any(MapSqlParameterSource.class), newCode)).thenReturn(1);
Mockito.when(newCode.getKey()).thenReturn(__preferredId__);
密钥工厂是一个简单的工厂,它只返回一个新的 GeneratedKeyHolder。它是在构建时注入的,因此此方法确实假设您使用的是 DI。
方法二
Mockito.when(namedParameterJdbcTemplate.update(Mockito.anyString(), Mockito.any(MapSqlParameterSource.class), Mockito.any(GeneratedKeyHolder.class))).thenAnswer(new Answer() {
Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
Map<String, Object> keyMap = new HashMap<String, Object>();
keyMap.put("", __preferredId__);
((GeneratedKeyHolder)args[2]).getKeyList().add(keyMap);
}
}).andReturn(1);
我并没有真正使用过 Mockito,如果代码不太正确,请见谅。 :)