我将以以下方式之一进行操作:
- 注入密钥。
- 桩方法调用并在那里设置密钥。
方法1:当我说“注入密钥”时,实际上是指注入一个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。
方法2
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,所以如果代码不太正确请见谅。:)