2017-06-26 33 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