繁体   English   中英

单元测试Java线程

[英]Unit testing Java Threads

我有一个主程序,该程序创建一个Thread做某事。

工作线程调用长期运行的服务,并使用某种回调函数来通知其响应。

public class TestingThreads {
    public static void main(String[] args) {
        Thread workerThread = new Thread(new WorkerThread());
        workerThread.run();
    }

    public static class WorkerThread implements Runnable {
        private ConfigService service;

        @Override
        public void run() {

            Response response = new Response() {
                @Override
                public void onResponse(String result) {
                    //Do something on the response
                }
            };

            Request request = new Request();
            service.callSomething(request, response);

            //Wait for response before exiting this run loop
        }

    }

    public static abstract class Response {
        public abstract void onResponse(String result);
    }

    public static class Request {
    }

    public static class ConfigService {
        public void callSomething(Request request, Response response) {
            // Call Long Running Process
        }
    }
}

我在为此用例创建JUnit测试用例时遇到问题。 您知道如何为该课程进行单元测试吗?

我实际上想模拟我的回答,但我不知道该怎么做。 在单元测试中,我不想实际调用ConfigService类。

如果我理解正确,那么您想测试请求是否得到响应。 那响应就是您希望看到的正确性吗?
我认为您的问题是Thread对您的代码运行syncrone,并且测试用例将在响应到达之前结束。
只要侦听器线程处于活动状态,就可以将代码保存在JUnit案例中。

为此,您可以使用:

Thread t = new WorkerThread();
t.join();

Thread.join(); 只要线程t处于活动状态,就可以防止执行下面的代码。 因此,它将阻止代码并在收到响应时继续执行。

您应该了解有关Mockito或EasyMock之类的模拟库的信息。 这提供了一种注入ConfigService实例的方法,该实例将返回可以测试的已知响应。

请注意,如果您希望线程同时运行,则应调用workerThread.start()而不是workerThread.run()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM