繁体   English   中英

如何从要测试的类中的@autowired字段获取值以及如何从抽象方法获取值

[英]How to get values from the @autowired field in a class to test and how to get value from abstract method

我正在使用Mockito使用Junit测试我的Java类。 我是Mockito和Junit测试用例的新手。 我有一堂课有弹簧配置。 请参见下面的代码段。

 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);
                    }
                }

以上测试案例在行“(((JdbcTemplate)jdbcTemplate.getJdbcOperations())。setFetchSize(1000);”处抛出NullPointerException。

因此,在上面的代码中,我将getQuery设置为null。 因为它是由其他类(如MyclassQuery类)实现的,所以AbstractTaskDao包含方法getQuery()的实现。 但是我是Mockito和Junit测试用例的新手,所以我没有在测试中给出明确的要求。

第二件事是@Autowired字段,这是jdbcTemplate为空,所以我将如何获得它的值。

更新:我正在获取代码“(((JdbcTemplate)jdbcTemplate.getJdbcOperations())。setFetchSize(1000);”的类强制转换异常。 由于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);     

试试这个代码,我还没有完全编译,所以您需要弄清楚最后一行。

@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(...);

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM