gpt4 book ai didi

java - Power/Mockito 忽略引用更新

转载 作者:行者123 更新时间:2023-12-01 11:29:02 24 4
gpt4 key购买 nike

我有以下类(class)

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 的引用在 linker.link(node ); 当链接方法更改对对象的引用时执行。

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

有什么想法吗?谢谢

最佳答案

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

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

class Holder {
Node node;
}

...因此对 Holder 的引用保持不变,但它包含的字段可能会发生变化。不过,如果可能的话,最好返回一个值而不是改变状态,这也可能使你的类更容易测试。

关于java - Power/Mockito 忽略引用更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30575672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com