当前位置: 首页 > 知识库问答 >
问题:

如何从一个测试类中的@Autowired域取值以及如何从抽象方法取值

竺承望
2023-03-14

我使用Mockito测试我使用JUnit的java类。我是Mockito和Junit测试用例的新手。我有一个类,它有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

第二件事是@autowired字段,这里是jdbcTemplate正在变为null,那么我将如何获得它的值。

更新:我得到了代码“((JdbcTemplate)JdbcTemplate.getjdbcoperations()).SetFetchSize(1000);”的类强制转换异常因为jdbcTemplate名为ParameterJdbcTemplate。如何解决这个问题。

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个答案

乐欣可
2023-03-14

尝试这段代码,我还没有完全编译,所以你需要找出最后一行。

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

}
 类似资料:
  • 我是Javascript新手,我正试图从包含多个对象的数组中获取id键的值。 通过 for..在循环中,我需要对象的id - 如1,2或3 - 与不同的值进行比较。 我试着这样做: 但是,我这样做了,删除Id值返回未定义。 我想不通为什么返回未定义,我无法解决这个问题。 我希望我能很好地表达自己,对不起我的英语不好。

  • 当我调试测试方法时,我看到变量是从文件中读取的。但是,在方法中,我看到变量是null。如何设置变量,以便在尝试测试此方法时在方法中可用?

  • 问题内容: 我有以下注释。 MyAnnotation.java SomeAspect.java SomeOther.java 在上面的课中, @MyAnnotation中* 传递了“ ABC ” 。现在如何在 SomeAspect.java 类的 处理 方法中访问“ ABC ”值? *** 谢谢! 问题答案: 您可以从ProceedingJoinPoint获取签名,如果方法调用,只需将其转换为Me

  • 大家好,我对java很陌生,还在学习OOP原理。直接回答问题。所以我有一个抽象类和两个继承自它的类。看起来是这样的: 现在我做到了: 在这一点上,我想做或(当然不是两者都做,因为我创建了一个孩子),但我两者都不能做。

  • 我有一个php对象,我想从中获取一些值 这就是我所拥有的: 如何获得变量中title的值?

  • 这是我从MPI ELAN获得的数据,它是该程序中使用的关于电影的文件: 我想从这个键中提取值:“TIME\u ORIGIN”:“82199”,我认为这是JSON数组,但我做不到。