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

Jdbc模板的Mockito测试用例和spring的keyHolder

梁丘扬
2023-03-14

我编写了一个测试用例,但在return keyholder.getKey()行得到一个空指针异常。

我的测试用例如下所示:

@InjectMocks
private UserDAOImpl userDAO;

@Mock
private JdbcTemplate jdbcTemplate;

@Mock
private KeyHolderFactory keyHolderFactory;

@Before
public void setup() {
    MockitoAnnotations.initMocks(this);
    ReflectionTestUtils.setField(userDAO, "jdbcTemplate", jdbcTemplate);
}

@Test
public void testCreateUser() {

    KeyHolder keyHolder = mock(GeneratedKeyHolder.class);

    when(keyHolderFactory.newKeyHolder()).thenReturn(keyHolder);

    User user = getUserInfo();

    Map<String,Object> map = new HashMap<>();
    map.put("id",1L);
    when(keyHolder.getKeys()).thenReturn(map);
    when(keyHolder.getKey()).thenReturn(1L);

    when(jdbcTemplate.update(Mockito.any(PreparedStatementCreator.class), Mockito.any(KeyHolder.class))).thenReturn(1);

    assertEquals(1L, userDAO.createUser(user));
}

方法如下所示:

 @Override
  public long createUser(User user) {

KeyHolder keyHolder = new GeneratedKeyHolder();

jdbcTemplate.update(connection -> {
  PreparedStatement ps = connection
      .prepareStatement("insert into user (address, first_name,last_name, email, password, phone_number, is_init, is_system_admin, created_at)"
              + " values( ?, ?, ?, ?, ?, ?, ?, ?,?)",
          Statement.RETURN_GENERATED_KEYS);
  ps.setString(1, user.getAddress());
  ps.setString(2, user.getFirstName());
  ps.setString(3, user.getLastName());
  ps.setString(4, user.getEmail());
  ps.setString(5, user.getPassword());
  ps.setString(6, user.getPhone());
  ps.setBoolean(7, user.isActive());
  ps.setBoolean(8, user.isSystemAdmin());
  ps.setDate(9, new Date(Date.from((user.getCreatedAt().toInstant())).getTime()));

  return ps;
}, keyHolder);

return (long) keyHolder.getKey();
  }

我创建了一个接口KeyHolderFactory:

public interface KeyHolderFactory {
KeyHolder newKeyHolder();
}

并且这个接口的实现如下:

public class GeneratedKeyHolderFactory implements KeyHolderFactory {

public KeyHolder newKeyHolder() {
    return new GeneratedKeyHolder();
  }
}

有人能帮我找到解决办法吗?

共有1个答案

周浩淼
2023-03-14

接下来是您的问题:

在测试类中,您已经嘲弄了binkeyholderFactory,这是正确的。然后创建模拟的keyholder,描述它的行为,并使keyholderFactory在被询问时返回keyholder。除了下一个:

在代码类方法中,使用new GeneratedKeyHolder()创建新的keyholder并且这个新的keyholder与测试类中的模拟实例不相关。它是绝对不同的对象。在您的测试类中的一个是模拟的,将遵循您的场景。但是,在您的测试类方法中,这个对象是另一个对象,当您执行keyholder.getKey()时,它当然不知道该做什么。

解决方案

您已经在测试中注入了keyholderFactory并很好地配置了它的行为。只需将其注入测试类,并在方法中使用KeyHolderFactory.NewKeyHolder()而不是New GeneratedKeyHolder()创建KeyHolder

 类似资料:
  • 我已经为web创建了mockito测试用例。我应该如何为服务层创建mockito测试用例。 我不能使用任何autowire,因为我没有应用程序上下文。它给了我错误: 其次,我有这个配置bean: 你能告诉我应该如何构造mockito测试类吗?如果我把所有的测试类放在web层,我就可以得到上下文。

  • 我对junit mockito非常陌生,并尝试使用mockito编写junit测试用例。 这是我的方法,我必须为此编写一个jUnit。 ChefService和ChefApi传递的方法参数来自第三方api 这里是呼叫chefService。listCookbookVersions()将返回CookBookVersion类类型的迭代器,如

  • 我使用Jdbctemplate从数据库中检索单个记录。这是方法。 在我的场景中,完全有可能不会命中我的查询,所以我的问题是如何绕过以下错误消息。 HTTP状态500 -请求处理失败;嵌套异常为org . spring framework . JDBC . badsqlgrammarexception:PreparedStatementCallback;SQL语法错误[select pet_adv,

  • 我正在为我的项目创建junit测试用例。我有下面的代码,我想在其中创建一个模拟, 我正在使用jUnit和mockito核心jar。我尝试了下面的代码, 使用上述代码,它在模拟loadProperties方法时抛出错误。如何模拟Spring静态类并返回我的模拟属性对象? 任何帮助都将不胜感激。

  • 我有下面一个班的方法。 使用mockito的junit测试用例将提供100%的代码覆盖率。

  • 我对Spring不熟悉。我正在尝试运行JDBCTempalte示例。我得到了ClassCastException。对我来说没什么意义。 我的上下文文件 我的主要课程 输出 我的 45 行是 我犯了什么错误吗??谢谢你的帮助 谢谢, CVSR 萨尔马