的Mockito。没有捕获参数值

时间:2017-07-18 14:55:56

标签: java unit-testing mockito

如何更改此代码以使其不会抛出异常?

ArgumentCaptor<Date> argument = forClass(Date.class);
verify(ps, times(0)).setDate(anyInt(), argument.capture());

typeHandler.setNonNullParameter(ps, 1, "20170120", DATE);

assertEquals(new Date(2017, 01, 20), argument.getValue());

更多代码:

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import java.sql.*;

public class DateStringTypeHandler extends BaseTypeHandler<String> {

    private static final DateTimeFormatter YYYY_MM_DD = DateTimeFormat.forPattern("yyyyMMdd");

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        LocalDate localDate = YYYY_MM_DD.parseLocalDate(parameter);
        ps.setDate(i, new Date(localDate.toDateTimeAtStartOfDay().getMillis()));
    }
}

@RunWith(MockitoJUnitRunner.class)
public class DateStringTypeHandlerTest {

    @Mock
    private PreparedStatement ps;
    private DateStringTypeHandler typeHandler;

    @Before
    public void before() {
        typeHandler = new DateStringTypeHandler();
    }

    @Test
    public void testSetNonNullParameterPreparedStatementIntStringJdbcType() throws SQLException {
        ArgumentCaptor<Date> argument = forClass(Date.class);
        verify(ps, times(0)).setDate(anyInt(), argument.capture());

        typeHandler.setNonNullParameter(ps, 1, "20170120", DATE);

        assertEquals(new Date(2017, 01, 20), argument.getValue());
    }
}      

verify抛出异常:

org.mockito.exceptions.base.MockitoException: 
No argument value was captured!
You might have forgotten to use argument.capture() in verify()...
...or you used capture() in stubbing but stubbed method was not called.
Be aware that it is recommended to use capture() only with verify()

Examples of correct argument capturing:
    ArgumentCaptor<Person> argument = ArgumentCaptor.forClass(Person.class);
    verify(mock).doSomething(argument.capture());
    assertEquals("John", argument.getValue().getName());

1 个答案:

答案 0 :(得分:3)

您应首先调用被测试类的方法。然后使用捕获器进行验证:

    @Test
    public void testSetNonNullParameterPreparedStatementIntStringJdbcType() throws SQLException {
        // Arrange
        ArgumentCaptor<Date> argument = forClass(Date.class);

        // Act
        typeHandler.setNonNullParameter(ps, 1, "20170120", DATE);

        // Assert            
        verify(ps).setDate(anyInt(), argument.capture());    
        assertEquals(new Date(2017, 01, 20), argument.getValue());
    }

此外,您现在可能不需要times(..)参数。