كيف يمكنني حدة اختبار طريقة جافا الذي يستخدم ProcessBuilder وعملية؟

StackOverflow https://stackoverflow.com/questions/207636

سؤال

ولدي طريقة جافا التي تبدأ حتى العملية مع ProcessBuilder، وأنابيب انتاجها في صفيف بايت، ثم يعود صفيف بايت لها عند الانتهاء من العملية.

والزائفة رمز:

ProcessBuilder b = new ProcessBuilder("my.exe")
Process p = b.start();
... // get output from process, close process

وماذا سيكون أفضل طريقة للذهاب نحو وحدة اختبار هذه الطريقة؟ لم أجد وسيلة للسخرية ProcessBuilder (الإصدار النهائي لها)، حتى مع رهيبة لا يصدق JMockit ، وأنه يعطي لي NoClassDefFoundError :

java.lang.NoClassDefFoundError: test/MockProcessBuilder
    at java.lang.ProcessBuilder.<init>(ProcessBuilder.java)
    at mypackage.MyProcess.start(ReportReaderWrapperImpl.java:97)
    at test.MyProcessTest.testStart(ReportReaderWrapperImplTest.java:28)

وأي أفكار؟


<القوي> الإجابة - يمكنك كما أوصى أولاف، وانتهى بي الأمر إعادة بيع ديون تلك الخطوط إلى واجهة

Process start(String param) throws IOException;

وأنا الآن تمرير مثيل من هذه الواجهة في الصف الأول أراد أن يختبر (في المنشئ الخاص به)، عادة باستخدام تطبيق الافتراضي مع خطوط الأصلي. عندما كنت ترغب في اختبار I ببساطة استخدام تطبيق وهمية واجهة. تعمل مثل السحر، على الرغم من أنني لم أتساءل عما إذا كان أنا على مدى تفاعل هنا ...

هل كانت مفيدة؟

المحلول

ودرع نفسك من الطبقات إلى أن سخر. إنشاء واجهة إما لفعل ما تريد حقا (على سبيل المثال إخفاء حقيقة أن العمليات الخارجية يشارك على الإطلاق) أو فقط من أجل عملية وProcessBuilder.

وأنت لا ترغب في اختبار، أن ProcessBuilder وعملية العمل، إلا أنه يمكنك العمل مع انتاجهم. عند إنشاء واجهة تنفيذ تافهة واحد (وهذا يمكن أن تفقد بسهولة) مندوبين لProcessBuilder وعملية، تنفيذ آخر يسخر هذا السلوك. في وقت لاحق قد يكون لديك حتى تنفيذ آخر أن يفعل ما تحتاجه دون بدء عملية أخرى.

نصائح أخرى

ومع أحدث الإصدارات من JMockit (0.98+) يجب أن تكون قادرة على الطبقات JRE وهمية بسهولة مثل عملية وProcessBuilder. لذلك، لا حاجة لإنشاء واجهات فقط للاختبار ...

ومثال كامل (باستخدام JMockit 1.16):

public class MyProcessTest
{
    public static class MyProcess {
        public byte[] run() throws IOException, InterruptedException {
            Process process = new ProcessBuilder("my.exe").start();
            process.waitFor();

            // Simplified example solution:
            InputStream processOutput = process.getInputStream();
            byte[] output = new byte[8192];
            int bytesRead = processOutput.read(output);

            return Arrays.copyOf(output, bytesRead);
        }
   }

    @Test
    public void runProcessReadingItsOutput(@Mocked final ProcessBuilder pb)
        throws Exception
    {
        byte[] expectedOutput = "mocked output".getBytes();
        final InputStream output = new ByteArrayInputStream(expectedOutput);
        new Expectations() {{ pb.start().getInputStream(); result = output; }};

        byte[] processOutput = new MyProcess().run();

        assertArrayEquals(expectedOutput, processOutput);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top