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);
}

のセッターを使用して、テストケースにモックを配置すると、 の実際のメソッドscをテストできます。barFirstClass

于 2015-08-11T20:16:59.277 に答える
1

根本的な問題は、モックなどを提供したいのに、FirstClassの独自のコピーを初期化することです。SecondClass

制御の反転または依存性注入のアプローチは、動作に必要なコンポーネントをクラスに与えることで、このような状況を軽減するように設計されています。代わりにのコピーを代わりに挿入できますか(たとえば、パラメーターを介して to )?そうすれば、テスト シナリオ中にモックを提供し、その結果としてメソッド呼び出しをテストできます。SecondClassFirstClassinit()

例えば

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

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