2017-06-26 34 views
0

我正在使用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);  
+0

1)模擬'jdbcTemplate' 2)使用@injectMocks註解來注入你的依賴關係。這兩件事是mokito的常見做法。 –

+0

嘲笑抽象方法和指定標誌'Mockito.CALLS_REAL_METHODS'的組合不應該工作我猜。您可能想要模擬該方法,或者爲實現該方法的其中一個子類創建模擬。 –

+0

@MinhKieu我加了@InjectMocks NamedParameterJdbcTemplate jdbcTemplate;像這樣,但仍然給予空值。即使我在這裏獲得這個模板的價值,我將如何將這個值傳遞給我想測試的類? – Kamini

回答

0

試試這個代碼,我沒有完全編譯,所以你需要弄清楚最後一行。

@Test 
public void testTask() throws InterruptedException { 
    //arrange 
    LocalDate tdate = LocalDate.parse("2014-02-23"); 
    AbstractTaskDao abstratTaskDao = Mockito.mock(AbstractTaskDao.class, Mockito.CALLS_REAL_METHODS); 
    NamedParameterJdbcTemplate jdbcTemplate = Mockito.mock(NamedParameterJdbcTemplate.class); 
    JdbcOperations operations = Mockito.mock(JdbcOperations.class); 

    when(jdbcTemplate.getJdbcOperations()).thenReturn(operations); 
    when(abstratTaskDao.getQuery()).thenReturn("select * from dual"); 

    //use reflection to inject autowired field. 
    org.springframework.test.util.ReflectionTestUtils.setField(abstratTaskDao, "jdbcTemplate", jdbcTemplate); 

    System.out.println("\n\t sql-"+abstratTaskDao.getQuery()); 

    //act 
    abstratTaskDao.addTask(myqueue, tdate); 

    //assert 
    verify(jdbcTemplate).query(...); 

} 
+0

我得到這個錯誤「通緝但未被調用:實際上,這個模擬與零交互。」在線驗證()。queryForList() – Kamini

+0

更新您的問題併發布您的新測試代碼。基本上,它是說你驗證一些方法調用來執行一次,但它從來沒有調用過。 –

+0

我已更新它,問題現在給予(JdbcTemplate)的Class cast異常。因爲我正在傳遞NamedJdbcparameterTemplate對象。 – Kamini