Power/Mockito 忽略参考更新
Power/Mockito ignoring reference update
我有关注 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
的引用指向 foundNode
对象,在行 linker.link(node);
执行为 link 方法更改对对象的引用。
然而,事实并非如此。在 Linker#link
方法中,引用已正确更新,但在 LinkerTest#testLink
方法中的 return 之后,引用仍然是原始引用,断言失败。
有什么想法吗?
谢谢
Java 仅 passes by value。您可以传递对对象的引用,这些对象可能会在方法中被修改,但调用站点的变量永远不会仅仅因为方法调用而引用不同的实例。
解决这个问题的一种方法是传入一个包装引用的对象:
class Holder {
Node node;
}
...因此对 Holder 的引用保持不变,但它包含的字段可能会更改。不过,如果可能的话,更喜欢return一个值而不是变异状态,这也可能使你的class更容易测试。
我有关注 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
的引用指向 foundNode
对象,在行 linker.link(node);
执行为 link 方法更改对对象的引用。
然而,事实并非如此。在 Linker#link
方法中,引用已正确更新,但在 LinkerTest#testLink
方法中的 return 之后,引用仍然是原始引用,断言失败。
有什么想法吗? 谢谢
Java 仅 passes by value。您可以传递对对象的引用,这些对象可能会在方法中被修改,但调用站点的变量永远不会仅仅因为方法调用而引用不同的实例。
解决这个问题的一种方法是传入一个包装引用的对象:
class Holder {
Node node;
}
...因此对 Holder 的引用保持不变,但它包含的字段可能会更改。不过,如果可能的话,更喜欢return一个值而不是变异状态,这也可能使你的class更容易测试。