1

はじめに:次の簡略化された単体テストを検討してください。

@Test
public void testClosingStreamFunc() throws Exception {
    boolean closeCalled = false;
    InputStream stream = new InputStream() {
        @Override
        public int read() throws IOException {
            return -1;
        }

        @Override
        public void close() throws IOException {
            closeCalled = true;
            super.close();
        }
    };
    MyClassUnderTest.closingStreamFunc(stream);
    assertTrue(closeCalled);
}

closed明らかにそれは機能しません、そうでないことについて不平を言いfinalます。

質問:close() Java単体テストのコンテキストで、テスト対象の関数がここのようなメソッドを呼び出すことを確認するための最良または最も慣用的な方法は何ですか?

4

2 に答える 2

2

インスタンス変数で通常のクラスを使用するのはどうですか?

class MyInputStream {
    boolean closeCalled = false;

    @Override
    public int read() throws IOException {
        return -1;
    }

    @Override
    public void close() throws IOException {
        closeCalled = true;
        super.close();
    }

    boolean getCloseCalled() {
        return closeCalled;
    }
};
MyInputStream stream = new MyInputStream();

独自のクラスを作成したくない場合は、Jmokitなどのモックフレームワークの使用を検討してください。

@Test
public void shouldCallClose(final InputStream inputStream) throws Exception {
    new Expectations(){{
        inputStream.close();
    }};

    MyClassUnderTest.closingStreamFunc(inputStream);
}
于 2013-03-26T12:58:20.487 に答える
2

このようなテストを行うためのフレームワークであるmockitoを見てみるべきだと思います。

たとえば、呼び出しの数を確認できます:http: //docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#4

import java.io.IOException;
import java.io.InputStream;

import org.junit.Test;

import static org.mockito.Mockito.*;

public class TestInputStream {

    @Test
    public void testClosingStreamFunc() throws Exception {
        InputStream stream = mock(InputStream.class);
        MyClassUnderTest.closingStreamFunc(stream);
        verify(stream).close();
    }

    private static class MyClassUnderTest {
        public static void closingStreamFunc(InputStream stream) throws IOException {
            stream.close();
        }

    }
}
于 2013-03-26T13:00:10.490 に答える