Power / Mockito忽略参考更新

时间:2015-06-01 14:06:26

标签: java junit mockito pass-by-reference powermock

我有以下课程

import com.model.domain.Node;

public class Linker {
    public void link(Node node){
        node = Node.findById(node.getId());

        if(node.getLinkedNode() == null)
            return;
    }
}

并对其进行单元测试

import static org.junit.Assert.*;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Mockito.when;

import com.model.domain.Node;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest({Node.class})
public class LinkerTest {

    private Linker linker = new Linker();

    @Before
    public void setUp() throws Exception {
        PowerMockito.mockStatic(Node.class);
    }

    @Test
    public void testLink() throws Exception {
        Node node = new Node();
        node.setId(123456L);

        Node foundNode = new Node();
        foundNode.setId(1234L);
        foundNode.setName("FounNode");

        when(Node.findById(anyLong())).thenReturn(foundNode);

        linker.link(node);

        assertEquals(node, foundNode);
    }
}

现在,我的问题是,在testLink测试中,我希望对象node的引用在执行第foundNode行之后指向linker.link(node);对象,因为链接方法将引用更改为物体。

但事实并非如此。在Linker#link方法中,引用已正确更新,但在LinkerTest#testLink方法返回后,引用仍然是原始引用,并且断言失败。

有什么想法吗? 感谢

1 个答案:

答案 0 :(得分:1)

仅限Java passes by value。您可以传递对象的引用,并且可以在方法中修改这些对象,但是由于方法调用,调用站点的变量将永远不会引用不同的实例。

解决此问题的一种方法是传入包装引用的对象:

class Holder {
  Node node;
}

...所以对Holder的引用保持不变,但它包含的字段可能会改变。但是,如果可能的话,更喜欢返回值而不是变异状态,这可能也会让您的课程更容易测试。