无法在Spring启动测试类中模拟jdbcTemplate

时间:2017-06-30 01:16:00

标签: spring-boot mockito jdbctemplate

我正在使用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无法被模拟/自动装配。

请让我知道我哪里出错。

1 个答案:

答案 0 :(得分:2)

  1. 你不需要同时使用@Mock和@Autowired。只使用@Mock

    @Mock private JdbcTemplate as400JdbcTemplate;

  2. 使用而不是@RunWith(SpringRunner.class) - > @RunWith(MockitoJUnitRunner.class)
  3. 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);
    
    }