【问题标题】:How to pass and mock var args of object in method如何在方法中传递和模拟对象的 var args
【发布时间】:2018-06-20 16:57:43
【问题描述】:

这是类的方法,我想用 mockito 编写单元测试用例

@Repository
public class EmployeeDaoImpl implements EmployeeDao {

    @Autowired
    DataSource dataSource;

    // private static Logger log = Logger.getLogger(UserDaoImpl.class);
    public void insertData(Employee emp) {

        String sql = "INSERT INTO Emp"
                + "(first_name,last_name, gender, city) VALUES (?, ?, ?,?)";

        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        jdbcTemplate.update(
                sql,
                new Object[] { emp.getFirstName(), emp.getLastName(),
                        emp.getGender(), emp.getCity() });

    }
|

下面我写了我的测试用例方法:

@Test
public void insertDataTest() {

    Employee emp= new Employee();
    emp.setUserId(1);
    emp.setFirstName("Somya");
    emp.setLastName("Kumari");
    emp.setGender("female");
    emp.setCity("Bangalore");
    jdbcTemplate = new JdbcTemplate(dataSource);
    int var = 0;

    Mockito.when(jdbcTemplate.update(Mockito.anyString(),
           Mockito.anyVararg())).thenReturn(var);

    empDao.insertData(emp);

    withSuccess();

}

这是我遇到的错误,请帮助我。

【问题讨论】:

  • 我还不能完全预测错误的原因,因为 Mockito 可能有点神秘,但我不认为这对你有用。 jdbcTemplate 在你的测试用例中不是一个模拟对象,所以我认为你最终会得到一些关于无法从非模拟返回模拟值的异常。
  • 另外,测试中的JdbcTemplate 与代码中的不同。你可以随心所欲地模拟它,但它不会改变被测代码的行为,它正在创建一个全新的JdbcTemplate。您可能想使用一些依赖注入来操作在测试代码中实际使用的对象。
  • 你能澄清一下你到底想测试什么吗?当您将Employee 传递给insertData 时,会调用jdbcTemplate.update
  • 我也不熟悉withSuccess。看起来它可能来自 Spring,但即便如此,这也不是它的正常用法。
  • JdbcTemplate 是线程安全的,因此不是自动连接数据源,而是自动连接 JdbcTemplate。这避免了代码必须创建一个新的 JdbcTemplate 实例,并且还通过注入一个模拟 JdbcTemplate 来简化测试。然后简单地验证模拟 JdbcTemplate 是使用预期参数调用的。

标签: java mockito junit4


【解决方案1】:

您需要在您的测试类中提供 jdbcTemplate 的@Mock

@Mock private JdbcTemplate template;

由于你没有得到任何NPE 而是InvalidUseOfMatchersException:,这仅仅意味着你有一个使用@Autowired 或new 运算符注入到你的测试类中的实例。

【讨论】:

    【解决方案2】:

    您必须在 when 调用中转换参数。否则参数将不明确,编译器无法将其解析为特定的update 方法。

    所以:

    Mockito.when(jdbcTemplate.update((String)Mockito.anyString(), (Object[])Mockito.anyVararg())).thenReturn(var);
    

    应该可以解决您的问题。至少它对我有用。

    【讨论】:

      猜你喜欢
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 2017-05-01
      • 2011-04-04
      • 2013-05-14
      • 1970-01-01
      • 2013-10-15
      相关资源
      最近更新 更多