带有mockito mocking namedparameterjdbctemplate的spring引导

7kqas0il  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(460)

尝试单元测试定义为以下内容的方法:

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[]结果为空。我的理解是它应该从模拟中的存根得到结果。请帮助我理解我做错了什么。

owfi6suc

owfi6suc1#

您似乎没有使用正确的导入 any() 因为如果它是正确的 ArgumentMatchers.any() 从mockito,mockito会抱怨你没有使用 ArgumentMatcher 对于的两个参数 .batchUpdate() .
您可以使用 import static org.mockito.ArgumentMatchers.*; 或使用 ArgumentMatchers.any() .
因此,作为第一步,请尝试以下操作:

when(namedParameterJdbcTemplate.batchUpdate(ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(rowsAffected);

或者不太通用,并匹配 SqlParameterSourceUtils.createBatch() 使用:

// I don't know what SqlParameterSourceUtils.createBatch() returns, so you might have to adjust it
when(namedParameterJdbcTemplate.batchUpdate(ArgumentMatchers.any(), ArgumentMatchers.eq("SOME RETURN"))).thenReturn(rowsAffected);
uoifb46i

uoifb46i2#

它通过将强制转换添加到参数匹配器来工作:更新的代码:

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

相关问题