我正在使用Mockito测试使用Junit的Java类。 我是Mockito和Junit测试用例的新手。 我有一个类是有弹簧配置。 请参阅下面的代码片段。如何从类中的@autowired字段中获取值以测试以及如何从抽象方法获取值
public abstract class AbstractTaskDao implements TaskDao {
@Autowired
NamedParameterJdbcTemplate jdbcTemplate;
@Override
public void addTask(BlockingQueue<String> queue, LocalDate tdate) {
String sql = getQuery();
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("tdate", Date.valueOf(tdate));
((JdbcTemplate) jdbcTemplate.getJdbcOperations()).setFetchSize(1000);
jdbcTemplate.query(sql, paramMap,new classA());
}
protected abstract String getQuery();
}
Below is my test class.
public class AbstractTaskDaoTest {
@Mock NamedParameterJdbcTemplate jdbcTemplate;
@Mock JdbcOperations operation;
BlockingQueue<String> myqueue;
@Before
public void setUp() throws IOException {
jdbcTemplate=mock(NamedParameterJdbcTemplate.class);
when(jdbcTemplate.getJdbcOperations()).thenReturn(operation);
//use reflection to inject autowired field.
org.springframework.test.util.ReflectionTestUtils.setField(abstratTaskPDao, "jdbcTemplate", jdbcTemplate);
}
@Test
public void testTask() throws InterruptedException{
LocalDate tdate=LocalDate.parse("2014-02-23");
AbstractTaskDao abstratTaskDao = Mockito.mock(AbstractTaskDao .class, Mockito.CALLS_REAL_METHODS);
System.out.println("\n\t sql-"+abstratTaskDao.getQuery());
abstratTaskDao.addTask(myqueue,tdate);
}
}
上述试验例在线抛出的NullPointerException “((的JdbcTemplate)jdbcTemplate.getJdbcOperations())的setFetchSize(1000);”。
所以在上面的代码中我得到getQuery为null。由其它类实现,如类MyclassQuery extends AbstractTaskDao包含方法getQuery()的实现。 但我是新来的Mockito和Junit测试用例的世界,所以我没有得到如何给测试显式调用。
第二件事是@Autowired字段在这里它是jdbcTemplate得到null.So我将如何得到这个值。 ((JdbcTemplate)jdbcTemplate.getJdbcOperations())。setFetchSize(1000);“(”JdbcTemplate“)”类型转换异常代码“((JdbcTemplate)jdbcTemplate.getJdbcOperations由于jdbcTemplate是NamedParameterJdbcTemplate。如何解决这个问题。
To solve this issue I added below line to code in AbstractTaskDaoTest class.
@Mock JdbcTemplate jdbcTemp;
jdbcTemp=mock(JdbcTemplate.class);
when(jdbcTemplate.getJdbcOperations()).thenReturn(jdbcTemp);
1)模拟'jdbcTemplate' 2)使用@injectMocks注解来注入你的依赖关系。这两件事是mokito的常见做法。 –
嘲笑抽象方法和指定标志'Mockito.CALLS_REAL_METHODS'的组合不应该工作我猜。您可能想要模拟该方法,或者为实现该方法的其中一个子类创建模拟。 –
@MinhKieu我加了@InjectMocks NamedParameterJdbcTemplate jdbcTemplate;像这样,但仍然给予空值。即使我在这里获得这个模板的价值,我将如何将这个值传递给我想测试的类? – Kamini