的Mockito。没有捕获参数值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了的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());
答案

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

    @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(..)参数。

以上是关于的Mockito。没有捕获参数值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mockito 捕获特定类型的列表

模拟无效方法的try catch块并使用EasyMock或Mockito捕获异常

简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值(转)

使用 Mockito 多次调用具有相同参数的相同方法

使用 Mockito 多次调用具有相同参数的相同方法

Android单元测试之Mockito的使用