0

我所处的场景

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。为什么 texts 数组没有更新?

4

2 回答 2

1

换这个...

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

使用 Setter ,然后在您的测试用例中sc放一个 Mock ,从而使您能够测试.barFirstClass

于 2015-08-11T20:16:59.277 回答
1

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

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

例如

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

// now test the invocations on your mock
于 2015-08-11T20:10:42.467 回答