模拟匿名内部类以更改外部局部最终变量



我有以下代码片段,其中内部匿名类将更改外部局部最终变量。

我想为这个代码片段编写统一的测试代码,我可以编写一个测试代理并在其中定义我的 callStorageProcess,尽管我不知道如何像匿名类那样更改外部最终变量

我正在使用Mockito,有什么线索吗?

        final List<String> result = new ArrayList<String>();
        proxy.callStoredProcedure(param1, param2,
                param3, resolveSQL(param4),
                new IProxyExtractor<GenericDTO>() {
                    @Override
                    public List<GenericDTO> extract(
                            final int resultSetindex, final ResultSet rs)
                            throws SQLException {
                        while (rs.next()) {
                            result.add(rs.getString(1));
                        }
                        return Arrays
                                .asList(new GenericDTO[] { new ABCDTO() });
                    }
                }, param5, param6);

您可以使用 Mockito Answer 来做到这一点(不过我还没有测试过这段代码):

ProxyClass mock = mock(ProxyClass.class);
when(mock.callStoredProcedure(any(), any(), any(), any(), any(), any(), any())
    .thenAnswer(new Answer<Void>() {
         public Void answer(InvocationOnMock invocation) {
             Object[] args = invocation.getArguments();
             IProxyExtractor<GenericDTO> proxyExtr = (IProxyExtractor<GenericDTO>) args[4];
             // Call the IProxyExtractor with a dummy ResultSet
             ResultSet rs = // mock ResultSet or extend it and populate it with custom data.
             GenericDTO[] dto1 = proxyExtr.extract(0, rs);
             GenericDTO[] dto2 = proxyExtr.extract(1, rs);

             return null;
         }
    });

看:

  • 使用回调存根
  • 何时/如何使用 Mockito 答案
  • 如何以编程方式从没有数据库的自定义数据创建 Java 结果集

如果您正在为测试实现 ProxyClass,那么类似这样的事情应该可以工作:

public class TestProxyClass extends ProxyClass {
    public void callStoredProcedure(param1, 
                                    param2, 
                                    param3, 
                                    param4, 
                                    IProxyExtractor<GenericDTO> extr, 
                                    param5,
                                    param6) {
        // do something else..
        ResultSet rs = // mock ResultSet or extend it and populate it with custom data.
        // Call the IProxyExtractor with a dummy ResultSet
        GenericDTO[] dto1 = proxyExtr.extract(0, rs);
        GenericDTO[] dto2 = proxyExtr.extract(1, rs);
        // do something else..
    }
}

话虽如此,请查看是否可以改进您的代码,以便IProxyExtractor实现返回列表而不是直接修改内部变量。您还可以使用某种收集器(受Java 8流的启发),它可以作为方法参数传递给IProxyExtractor#extract

相关内容

  • 没有找到相关文章

最新更新