我在的场景
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
副本,而您希望提供一个模拟或类似的副本。
控制反转或依赖注入方法旨在通过为类提供操作所需的组件来缓解这种情况。你能代替注入的SecondClass
副本到FirstClass
代替(例如,通过一个参数到init()
) ?这样,您就可以在测试场景中提供模拟,从而测试方法调用。
。
FirstClass fc = new FirstClass();
fc.init(myMockedSecondClass);
fc.bar(...);
// now test the invocations on your mock
代替…
public void init(){
SecondClass sc = new SecondClass(this);
}
使用sc
的Setter,然后在测试用例中放置Mock,从而使您能够测试FirstClass
的真正bar
方法。