如何在方法中传递和模拟对象的var args

时间:2018-06-20 16:57:43

标签: java mockito junit4

这是该类的方法,为此,我想使用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();

}

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

Error Console

2 个答案:

答案 0 :(得分:0)

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

@Mock private JdbcTemplate template;

由于没有得到NPE,而是得到InvalidUseOfMatchersException:,因此,这仅意味着您使用@Autowired或new运算符将实例注入了测试类。

答案 1 :(得分:0)

您必须在when调用中强制转换参数。否则,参数将变得模棱两可,并且编译器无法将其解析为特定的update方法。

所以:

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

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