首页 > 解决方案 > 带有 Mockito 模拟的 Spring Boot NamedParameterJdbcTemplate

问题描述

尝试对定义为的方法进行单元测试:

public void myMethod(List<? extends MyModel> model){
  int[] result = namedParameterJdbcTemplate.batchUpdate("update query", SqlParameterSourceUtils.createBatch(model));
}

在我的测试类中,我将测试方法定义为

class MyTestClass{

  @Mock
  NamedParameterJdbcTemplate namedParameterJdbcTemplate;
   
  @InjectMocks
  MyDao dao;

  @Test
  public void testMyMethod() {

    final int[] rowsAffected = new int[]{1,2};

    when(namedParameterJdbcTemplate.batchUpdate(any(), SqlParameterSourceUtils.createBatch(Arrays.asList(anySet())))).thenReturn(rowsAffected);
        
    List<MyModel> myModels = new ArrayList<>();
    MyModel mymodel = new MyModel();
    mymodel.setSomeParam("");
    myModels.add(mymodel);
    dao.myMethod(myModels);
        
  }
}

在运行此测试方法时,我在被调用的方法(myMethod())中得到 NullPointerException。int[] 结果为空。我的理解是它应该从模拟中的存根中得到结果。请帮助我理解我做错了什么。

标签: springspring-bootmockitojunit-jupiterjdbcnamedparametertemplate

解决方案


它通过将演员添加到参数匹配器来工作:更新代码:

    when(namedParameterJdbcTemplate.batchUpdate(anyString(), (SqlParameterSource[]) any())).thenReturn(rowsAffected);

推荐阅读