Multithreading Thread Thread=新线程(()->;{/code})和Executorservice.submit(线程)。如何使用powermock在此线程上编写junit

Multithreading Thread Thread=新线程(()->;{/code})和Executorservice.submit(线程)。如何使用powermock在此线程上编写junit,multithreading,junit,mockito,executorservice,powermockito,Multithreading,Junit,Mockito,Executorservice,Powermockito,请帮助我使用Mockito/Powermock为这段代码编写Junit,因为lamda表达式和executor服务的缘故,我觉得这很困难 public class myClass { ExecutorService executorService; public void testMethod(String a){ Thread thread = new Thread(() -> { //logic a=

请帮助我使用Mockito/Powermock为这段代码编写Junit,因为lamda表达式和executor服务的缘故,我觉得这很困难

public class myClass {

    ExecutorService executorService;

    public void testMethod(String a){
        Thread thread = new Thread(() -> {
            //logic
            a= testDAo.getStatus();
            while (true) {
                if (Thread.interrupted()) {
                    break;
                }

                if (a() != "done" || a() != "fail") {
                    Thread.yield();
                    try {
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                    }
                } else {
                    break;
                }
            }
        }
        Future task = executorService.submit(thread);

        while (!task.isDone()) {
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
            }
        }
    }

}
这里有很多东西:

  • 首先:对于测试执行器和并行执行,使用a非常有用(因为它去掉了并行方面)
  • 您在编写单元测试时遇到困难,因为您的生产代码太复杂了
因此,真正的答案是:后退一步,改进您的生产代码。为什么还要将线程推送到executor服务中

executor服务已经在一个线程池上做了一些事情(至少你通常是这样使用它们的)。所以你把一个线程推到一个线程池中,然后你就有了等待“两次”的代码(首先在该线程内,然后在将来在线程外)。这只会为小收益增加大量的复杂性

长话短说:

  • 我会去掉“内线程”——让执行器任务等待结果可用
  • 然后:如果lambda给你带来麻烦,那么就不要使用它们。只需创建一个实现该代码的命名小类。然后你就可以为这个小类编写单元测试。换句话说:不要创建做5件不同事情的巨大“单元”。一个好的单元的本质是做一件事(单一责任原则!).一旦你遵循了这个想法,测试也变得容易多了

感谢您的输入。我可以使用下面的代码实现这一点。我们让实际线程执行,我使用Mockito和Powermock.Spy@SpyExecutorService executorService=Executors.newFixedThreadPool模拟线程内的所有逻辑(2);我诚实的观点:错误的方法。您保留了难以测试的复杂生产代码,并通过使用PowerMock解决了问题。这正是我发现PowerMock是一个错误选择的原因。因为它鼓励人们保留他们糟糕的设计。。。