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



我在的场景

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方法。

相关内容

  • 没有找到相关文章

最新更新