如何从 class 中的@autowired 字段获取值进行测试以及如何从抽象方法中获取值
How to get values from the @autowired field in a class to test and how to get value from abstract method
我正在使用 Mockito 测试我的 java classes 使用 Junit。
我是 Mockito 和 Junit 测试用例的新手。
我有一个 class 具有 spring 配置。
请参阅下面的代码片段。
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 为空。因为它由其他 classes 实现,例如 class MyclassQuery extends AbstractTaskDao 包含方法 getQuery() 的实现。
但是我是 Mockito 和 Junit 测试用例世界的新手,所以我不知道如何在测试中进行显式调用。
第二件事是这里的 @Autowired 字段,它是 jdbcTemplate 正在获取 null.So 我将如何获取它的值。
更新:
我收到代码“((JdbcTemplate) jdbcTemplate.getJdbcOperations()).setFetchSize(1000);”的 class 转换异常由于 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(...);
}
我正在使用 Mockito 测试我的 java classes 使用 Junit。 我是 Mockito 和 Junit 测试用例的新手。 我有一个 class 具有 spring 配置。 请参阅下面的代码片段。
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 为空。因为它由其他 classes 实现,例如 class MyclassQuery extends AbstractTaskDao 包含方法 getQuery() 的实现。 但是我是 Mockito 和 Junit 测试用例世界的新手,所以我不知道如何在测试中进行显式调用。
第二件事是这里的 @Autowired 字段,它是 jdbcTemplate 正在获取 null.So 我将如何获取它的值。
更新: 我收到代码“((JdbcTemplate) jdbcTemplate.getJdbcOperations()).setFetchSize(1000);”的 class 转换异常由于 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(...);
}