我的問題是類似this SO question嘲諷JdbcTemplate.queryForObject(...,...,...)與1.9.5的Mockito
我有類似下面服務中有兩個JdbcTemplate.queryForObject(..,...,...,)
電話,
depositPostedAmt = jdbcTemplate.queryForObject(Constants.FETCH_DEPOSIT_POSTED_AMT, BigDecimal.class,new Object[] { remitBean.getDepositId() });
和
claimPostedAmt =jdbcTemplate.queryForObject(Constants.FETCH_CLAIM_POSTED_AMOUNT,BigDecimal.class, new Object[] { claim.getClaimId(), remitBean.getContractNum() });
第三個參數,new Object[]
是這兩個電話和實際的SQL字符串不同而不同。 所以我試圖用不同的戲弄在兩種情況下返回兩個不同的對象,如下圖所示,
when(jdbcTemplate.queryForObject(eq(Constants.FETCH_DEPOSIT_POSTED_AMT), eq(BigDecimal.class), anyObject())).thenReturn(depositPostedAmt);
when(jdbcTemplate.queryForObject(eq(Constants.FETCH_CLAIM_POSTED_AMOUNT), eq(BigDecimal.class), anyObject())).thenReturn(claimPostedAmt);
即我想在兩個不同的查詢,接收兩個不同BigDecimal
。
我收到depositPostedAmt
如預期,但claimPostedAmt
總是空,即使我在@Before方法相同depositPostedAmt
所以我猜測,我when
匹配沒有發現任何比賽都初始化它。我已經嘗試了第三個參數匹配的各種語法,如any(Object[].class)
和anyRef(objectArray)
等,但第二次,我總是得到NULL。
我不知道我缺少什麼,因爲沒有錯誤。我正在使用JUnit以及Mockito 1.9.5。
這裏是示例代碼 - 一切正常,但claimPostedAmt
在被調用的服務中保持爲空。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class, loader = AnnotationConfigContextLoader.class)
public class RCMatchDaoImplTest{
@Autowired private RCMatchDaoImpl service;
@Autowired private JdbcTemplate jdbcTemplate;
@Autowired private Logger logger;
private RemitBean remitBean;
private List<RemitBean> remitBeanList;
private BigDecimal depositPostedAmt,claimPostedAmt,remitAmount;
private ClaimVO claim;
private List<ClaimVO> claims;
@Before
public void setUp() throws NoSuchFieldException, SecurityException, Exception{
/* Set dependencies*/
service.setJdbcTemplate(jdbcTemplate);
setFinalStatic(RCMatchDaoImpl.class.getDeclaredField("logger"),logger);
remitBean = new RemitBean();
remitBeanList=new ArrayList<>();
claim= new ClaimVO();
claims= new ArrayList<>();
remitBeanList.add(remitBean);
depositPostedAmt=new BigDecimal(-10);
claimPostedAmt = new BigDecimal(-10);
remitAmount=new BigDecimal(20);
claims.add(claim);
}
private static void setFinalStatic(Field field, Object newValue) throws Exception{
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}
@Test
public void testLucenePost_refund_success() throws SQLException{
/* Set Data */
remitBean.setRemitType("R");
remitBean.setRemitAmt(remitAmount);
remitBean.setDepositId(6866418);
remitBean.setClaims(claims);
depositPostedAmt=depositPostedAmt.add(new BigDecimal(20));
claimPostedAmt=claimPostedAmt.add(new BigDecimal(10));
claim.setClaimId(6866418);
claim.setContractNum("100");
Object[] depositParams = new Object[] { 6866418 };
Object[] claimParams = new Object[] { 6866418,"100" };
/* Record Invocations*/
when(jdbcTemplate.queryForObject(eq(Constants.FETCH_DEPOSIT_POSTED_AMT), eq(BigDecimal.class), anyObject())).thenReturn(depositPostedAmt);
when(jdbcTemplate.queryForObject(eq(Constants.FETCH_CLAIM_POSTED_AMOUNT), eq(BigDecimal.class), anyObject())).thenReturn(claimPostedAmt);
doNothing().when(logger).error(anyString());
/* Play the Service */
service.lucenePost(remitBeanList);
/* Verify Results */
/* reset data to original value as in SetUp method*/
}
只是爲了完整起見,這裏是我的上下文類也
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.slf4j.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
@Configuration
public class TestConfig {
@Mock JdbcTemplate jdbcTemplate;
@Mock Logger logger;
TestConfig(){
MockitoAnnotations.initMocks(this);
}
@Bean
public RCMatchDaoImpl getRCMatchDaoImpl() {
return new RCMatchDaoImpl();
}
@Bean
public JdbcTemplate jdbcTemplate(){
return jdbcTemplate;
}
@Bean
public Logger logger(){
return logger;
}
}
我們可以看到整個測試(也許你可以張貼一些[MCVE])? –
@AdrianShum - 不,在實際的方法調用中,它不是「BigDecimal」的Object實例,而是「.class」參數。 –
雅,發現立即評論並立即刪除評論:P –