Мой вопрос похож на this SO questionMocking JdbcTemplate.queryForObject (.., ..., ...,) с Mockito 1.9.5
У меня есть два 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', а аргумент' .class'. –
ya, нашел, что сразу после комментирования и сразу же удалил комментарий: P –