java - Mockito thenReturn 在来自泛型函数时返回 null

标签 java generics mockito

我想在类中模拟 ResultSet,其参数来自通用返回函数 (getSQLValue):

public class MyClass{

    TableClass clsTableClass;

    public void getResults(Integer index, Integer value, String str) throws SQLException {

        try (ResultSet rsResult = clsTableClass.getRecords(
                getSQLValue(index, value, -1),
                getSQLValue(index, str, "")))
        {
            // do stuff
        }
    }

    private <T> T getSQLValue(Integer index, T t, T def) {
        return (index> 0) ? def : t;
    }
}

带有签名方法的表类:

public class TableClass {

    public ResultSet getRecords(Integer value, String str)  {
        // do stuff
    }

这是单元测试类:

public class MyClassTest {

    @Mock(name = "clsTableClass")
    TableClass clsTableClass;
    @InjectMocks
    MyClass clsMyClass;

    @Before
    public void setUp() throws Exception
    {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testClass() throws Exception
    {
        ResultSet rsResult = Mockito.mock(ResultSet.class);

        when( clsTableClass.getRecords(
                any(Integer.class),
                any(String.class)).thenReturn(rsResult);
    }
}

问题是ResultSet一直是null,调试时可以确认。

最佳答案

事实证明,Mockito 在将第一个参数“接受”为 Integer 之后,未能将第二个参数接受为 String。解决方案(经过多次调试)是将测试函数中的 any() 匹配器转换到相应的类类型:

@Test
public void testClass() throws Exception
{
    ResultSet rsResult = Mockito.mock(ResultSet.class);

    when(clsTableClass.getRecords(
            (Integer) any(),
            (String) any()).thenReturn(rsResult);
}

现在 Mockito 将匹配参数并且 ResultSet 将不再返回 null

关于java - Mockito thenReturn 在来自泛型函数时返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48403966/

相关文章:

Java 泛型和泛型类型

java - 编译时模拟

java - 记录时使用同步

java - 方法签名中的参数化列表

java - 文本字段的 numberformaexception + 带条件的文本字段的格式错误

scala - Shapeless 在通用上下文中不起作用

java - 你如何让 Mockito 与 Kotlin 不可为空的类型配合得很好?

mockito - 等到@KafkaListener 使用@EmbeddedKafka 在测试中完成处理消息

java - checked exception/unchecked exception应该什么时候选?

java - 策略模式和带有接口(interface)的变量