我正在使用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