我正在使用Spring boot和Mockito进行测试。我已经能够为Service层编写测试用例,并且它们正常工作。但是,DAO层的测试用例没有。 jdbcTempolate对象taht被模拟并且自动装配在执行测试用例时给出空指针。以下是详细信息:
我的DAOTest课程:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = EcommerceApplication.class)
public classEcommerceDaoTest {
@InjectMocks
private IEcommerceDao ecommerceDao = new EcommerceDaoImpl();
@Mock
@Autowired
private JdbcTemplate as400JdbcTemplate;
@Before
public void setUp() throws Exception
{
MockitoAnnotations.initMocks(this);
}
@Test
public void checkOrderExistsTest() throws EcommerceException{
Mockito.when(as400JdbcTemplate.queryForObject(queryForOrder,new Object[]
{"1000"}, int.class)).thenReturn(1);
boolean exists =
ecommerceDao.checkOrderExists("1000");
assertTrue(exists);
}
}
EcommerceDAOImpl.java:
@Override
public boolean checkOrderExists(String orderNo)throws EcommerceException{
boolean doesExist = false;
int count = 0;
try{
count= as400JdbcTemplate.queryForObject(queryForOrder, new Object[]{orderNo}, int.class);
if(count >0){
doesExist = true;
}
}
catch(Exception e){
}
return doesExist;
}
AS400Config.java:
@Bean
@Autowired
public JdbcTemplate as400JdbcTemplate(@Qualifier("as400DataSource")DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
ECommerceApplication.java
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,
HibernateJpaAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class })
@EnableTransactionManagement
@Import(As400Configuration.class)
public class EcommerceApplication {
public static void main(String[] args) {
SpringApplication.run(EcommerceApplication.class, args);
}
}
当我运行测试用例时,我得到as400JdbcTemplate的Null指针异常。功能正常。它只是DAO层的测试用例失败,因为jdbctemplate无法被模拟/自动装配。
请让我知道我哪里出错。
答案 0 :(得分:2)
你不需要同时使用@Mock和@Autowired。只使用@Mock
@Mock private JdbcTemplate as400JdbcTemplate;
aslo将模拟注入dao,你可以在春季测试中使用ReflectionTestUtils。
public static void setField(Class targetClass,String name,Object value)
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
ReflectionTestUtils.setField(ecommerceDao ,"as400JdbcTemplate" ,
as400JdbcTemplate);
}