gpt4 book ai didi

java - 如何模拟从另一个方法调用的方法

转载 作者:行者123 更新时间:2023-12-02 04:27:28 24 4
gpt4 key购买 nike

我所处的场景

public class SecondClass{

SecondClass(FirstClass fc){
...
}

public void foo(String a,String b){
....
}
}

public class FirstClass{
private SecondClass sc;
public void init(){
sc = new SecondClass(this);
}

public void bar(List<Integer> input){
.....
sc.foo(s1,s2);
}
}

我想获取进入 foo 的字符串参数 a 和 b。测试类如下所示

@PrepareForTest({ FirstClass.class, SecondClass.class })
public class SampleTest
{
private String[] texts;

@Test
public void testBar() throws Exception
{
texts = new String[2];

final FirstClass fc = mock(FirstClass.class);
final SecondClass sc = spy(new SecondClass(fc));

doAnswer(invocation -> {
texts = (String[]) invocation.getArguments();
return null;
}).when(sc).foo(anyString(), anyString());

final List<Integer> input = new ArrayList<>();
input.add(1);
fc.bar(input);

System.out.println(texts[0]+"<>"+text[1]);
}
}

末尾的 sysout 打印 null<>null。为什么文本数组没有更新?

最佳答案

根本问题是 FirstClass 初始化它自己的 SecondClass 副本,而您想要提供模拟或类似的副本。

控制反转或依赖注入(inject)方法旨在通过为类提供操作所需的组件来缓解这种情况。您能否将 SecondClass 的副本注入(inject)FirstClass 中(例如通过 init() 的参数)?这样,您就可以在测试场景中提供模拟,从而测试您的方法调用。

例如

FirstClass fc = new FirstClass();
fc.init(myMockedSecondClass);
fc.bar(...);

// now test the invocations on your mock

关于java - 如何模拟从另一个方法调用的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31950981/

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