猿问

对线程应用程序进行单元测试

我正在考虑如何使用 mockito 为此编写测试用例。


例如,我的主线程中的部分逻辑是创建一个执行 3 件事的线程。请在下面查看我的注释代码。


现在 RequestThread 可以根据来自主程序的输入数量产生多次。


public class MainThreads {

    public static void main(String[] args) {

        RequestThread rt = new RequestThread("sample");

        rt.start();


        //RequestThread another = new RequestThread("sample-2");

        //another.start();


        //RequestThread newThread = new RequestThread("sample-3");

        //newThread.start();

    }


    public static class RequestThread implements Runnable{

        private final String request;


        public RequestThread(String request) {

            this.request = request;

        }


        @Override

        public void run() {

            //1. Instantiate a service passing the required request parameter

            MyDataWebService service = new MyDataWebService(request);


            //2. Get the returned data

            List<String> dataList = service.requestData();


            //3. Write to file

            Path file = Paths.get("/someDir/" + request);

            Files.write(file, dataList, Charset.forName("UTF-8"));

        }


    }

}

我的问题是,我无法弄清楚如何为线程类正确编写 JUnit/Mockito 测试。我一般不太了解 Mockito 和 JUnit,所以我正在寻找一种方法来对线程应用程序进行单元测试。


有人可以指导我如何对这样的事情进行单元测试吗?


慕娘9325324
浏览 193回答 2
2回答

隔江千里

一个独特的非答案:在 2018 年,您不再使用“原始”线程。Java 现在提供了更好的抽象,例如ExecutorService。猜猜看:当您让代码将任务提交到这样的服务中时,您可能可以使用同线程执行程序服务对其进行测试。意思是:通过使用这样的抽象并将您的交付分解为特定的服务,您可能(几乎)不仅可以完全测试小单元,还可以测试任务如何进入您的系统并进行处理。换句话说:您对“任务”进行单元测试,然后在任务进入这样的执行器时对任务的集成进行“单元”测试。然后你只剩下一些真正的功能/集成测试来检查“真正的并行”解决方案是否按预期运行。其他任何事情都会很快变得复杂。在普通单元测试中使用真实线程会导致不一致的行为,或增加运行时间(比如测试等待线程异步执行某事)。就像你的例子一样:你的测试只是坐在那里,定期检查预期的文件是否是用预期的内容编写的。导致:在失败之前应该等待多长时间?等待时间不够长意味着您的测试偶尔会失败,因为代码有时需要更长的时间。如果您等待的时间过长,则会增加您运行测试所需的总时间。您不希望以数百个单元测试结束,因为“等待其他线程”需要 10、20 秒。
随时随地看视频慕课网APP

相关分类

Java
我要回答