当前位置: 首页 > 知识库问答 >
问题:

easymock如何模拟/设置公共最终变量

宗安宁
2023-03-14

我有一个接一个的类来测试模拟对象。

public class FordFulkerson {

FlowNetwork network;
Search searchMethod;    

public FordFulkerson (FlowNetwork network, Search method) {
    this.network = network;
    this.searchMethod = method;
}

public boolean compute () {
    boolean augmented = false;
    while (searchMethod.findAugmentingPath(network.vertices)) {
        processPath(network.vertices);
        augmented = true;
    }
    return augmented;
}

protected void processPath(VertexInfo []vertices) {
    int v = network.sinkIndex;

    // Determine the amount. Goal is to find the smallest 
    int delta = Integer.MAX_VALUE;
    while (v != network.sourceIndex) {
        int u = vertices[v].previous;

        // Over a forward edge, 
        int flow;
        if (vertices[v].forward) {
            flow = network.edge(u, v).capacity - network.edge(u, v).flow;
        } else {
            flow = network.edge(v, u).flow;
        }

        if (flow < delta) { delta = flow; }

        v = u;  // follow reverse path to source
    }

    // push minimal increment over the path
    v = network.sinkIndex;
    while (v != network.sourceIndex) {
        int u = vertices[v].previous;

        if (vertices[v].forward) {
            network.edge(u, v).flow += delta;
        } else {
            network.edge(v, u).flow -= delta;
        }

        v = u;  // follow reverse path to source
    }

    Arrays.fill(network.vertices, null);   // reset for next iteration.
}
}

我的测试:

public class FordFulkersonMockTest {
private FordFulkerson classUnderTest;
private FlowNetwork mockNetwork;
private Search mockSearch;

@Before
public void setUp() {
    mockNetwork = createMock(FlowNetwork.class);
    mockSearch = createMock(Search.class);
    classUnderTest = new FordFulkerson(mockNetwork, mockSearch );

}

@Test
public void test01() {
    expect(mockSearch.findAugmentingPath(null)).andReturn(false);

    replay(mockSearch);
    boolean res = classUnderTest.compute();
    assertEquals(false, res);
    verify(mockSearch);
}


@Test
public void test02() {
    expect(mockSearch.findAugmentingPath(null)).andReturn(true);
    try{
        Field f = mockNetwork.getClass().getDeclaredField("sinkIndex");
        f.setAccessible(true);
        f.set(mockNetwork, 0);
        f = mockNetwork.getClass().getDeclaredField("sourceIndex");
        f.setAccessible(true);
        f.set(mockNetwork, 0);
    }catch(Exception e)
    {
        fail(e.getMessage());
    }
    replay(mockNetwork);
    replay(mockSearch);
    boolean res = classUnderTest.compute();
    assertEquals(true, res);
    verify(mockSearch);
}

}

Test01工作正常,但在Test02中我有问题。在Test02方法中,需要调用进程路径。它使用mockNetwork公共最终变量。我不知道在哪里设置它们。它导致了空异常。在上面的代码中,我试图更改此字段的可访问性并设置它们,但现在我在消息“sinkIndex”中出现错误。

如何在mockNetwork中模拟公共最终变量?我正在使用Easymock。

共有1个答案

滕胜涝
2023-03-14

您说过您修改了FlowNetwork的源代码,因此您可以执行以下操作,从而使设计更加稳健,测试更加容易:

  1. 封装这两个变量(即私有int-sinkIndex和int-getSinkIndex())
  2. expect(mockNetwork.getSinkIndex())。andReturn(0)。anyTimes()

猜测:mockNetwork.getClass()正在返回一个没有状态(即没有字段)的cglib EasyMock代理,您可以在调试器中检查它。因此getDeclaredField()返回null

如果您真的想使用publics,您可以尝试FlowNetwork.class.getDeclaredField

 类似资料:
  • 我有最后一节课。 org.mockito.exceptions.base.MockitoExc0019:不能模拟/间谍类改造2.响应Mockito不能模拟/监视以下内容:-最终类-匿名类-原始类型 如何使用Powermockito模拟响应类?

  • 我有以下类要用模拟私有对象创建进行测试, 在上述场景中,如何使用EasyMock模拟私有“Dialog”变量及其实例化以及私有“listener”变量,以便在有条件的基础上继续执行其余操作。

  • 本文向大家介绍laravel框架如何设置公共头和公共尾,包括了laravel框架如何设置公共头和公共尾的使用技巧和注意事项,需要的朋友参考一下 可以新建一个布局模板,layout.blade.php 在layout中设置公共头、尾 再新建个内容模板,content.blade.php 继承布局模板 当然公共头部也可以再单独写一个模板header.blade.php 在layout中用@includ

  • 问题内容: 我一直想知道Java中的单例。按照惯例,单例设置如下: 最近,我切换到使用以下内容: 由于没有空检查,因此它更短,更快捷,而且打字对我来说比打字好。有什么理由不能使第二种方法成为主流呢? 问题答案: 第一个版本在第一次实际需要时创建实例,而第二个版本(较短的版本)在初始化类后立即运行构造函数 类或接口类型T将在以下任何一种首次出现之前立即初始化: T是一个类,并创建T的实例。 T是一个

  • 我在Windows7上使用i7处理器,我正在尝试使用Android SDK模拟器。然而,当我将像素密度设置为320并打开GPU时,它的仿真开始滞后和冻结,它的浏览器几乎无法使用(每秒1帧或更少)。 除了转移到Linux之外,还能做什么来使它顺利工作吗?我注意到GPU仿真对性能的影响最大。

  • 模拟由某个类实现的接口方法很容易,但如果有一个类并且有一个静态方法,那么我们如何借助easymock对其进行模拟呢?? supose是一个a类,有一个void retruned方法作为公共静态void methodA(一些参数…){} 我们如何在EasyMock的帮助下模仿A的方法methodA