Unit testing 无法在单独的类中获取Executor的模拟实例

Unit testing 无法在单独的类中获取Executor的模拟实例,unit-testing,mocking,easymock,powermock,executors,Unit Testing,Mocking,Easymock,Powermock,Executors,我试图模拟java.util.concurrent包中的ExecutorService和Executor 如果我尝试在模拟对象的同一个类(测试类)中获取对象,我就能够获得模拟对象。但是,如果我尝试在不同的类(我要测试的类)中获取模拟对象,那么它将从java.util.concurrent返回实际对象。下面是代码片段 我要测试的类: public class MyClass { public void myMethod() { ExecutorService exe

我试图模拟java.util.concurrent包中的ExecutorService和Executor

如果我尝试在模拟对象的同一个类(测试类)中获取对象,我就能够获得模拟对象。但是,如果我尝试在不同的类(我要测试的类)中获取模拟对象,那么它将从java.util.concurrent返回实际对象。下面是代码片段

我要测试的类:

public class MyClass
{
    public void myMethod()
    {
        ExecutorService executorService = Executors.newFixedThreadPool(2, new MyThreadFactory());

        for (int count = 0; count < 2; count++)
        {
            executorService.submit(new Thread());
        }
    }
}

class MyThreadFactory implements ThreadFactory
{
    @Override
    public Thread newThread(Runnable r)
    {
        return null;
    }
}    
如果MyClassTest.testMyMethod()如下所示,则返回mocked对象

    @Test
    public void testMyMethod()
    {
        prepareMocks();

        //Following code reurned mocked instance of ExecutorService
        ExecutorService executorService = Executors.newFixedThreadPool(2, new MyThreadFactory());

        for (int count = 0; count < 2; count++)
        {
            executorService.submit(new Thread());
        }
    }
我希望在myClass.myMethod中获得Executors/ExecutorService的模拟实例

@Test
public void testMyMethod()
{
    prepareMocks();

    /*
     * Within myClass.myMethod(), Executors.newFixedThreadPool() returns actual instance of ThreadPoolExecutor
     * instead of mocked object
     */
    MyClass myClass = new MyClass();
    myClass.myMethod();
}

这是预期的行为吗?有人能解释一下这种行为吗?我遗漏了什么吗?

你需要让全班同学知道将会有一场模拟的比赛。在
@PrepareForTest()
中,尝试还包括调用静态。通过这种方式,您可以告诉它模拟静态的执行,以及告诉它模拟将在哪里进行。尝试更新
@PrepareForTest({Executors.class,MyClass.class})


当测试类直接调用static时,在
@PrepareForTest()
中有
Executors.class
,这样它就知道如何“注入”模拟到执行中。当您调用另一个类时,在运行时,您调用的类不知道如何使用静态类的模拟版本,这就是为什么它使用它知道的原始代码,而不是其范围之外的模拟。添加调用静态对象(您测试的对象)的类将允许在运行静态模拟时挂接它。

您知道为什么不总是需要它吗?例如,在模拟会话时。请考虑以下内容:(测试类)和(外部类)。
@Test
public void testMyMethod()
{
    prepareMocks();

    /*
     * Within myClass.myMethod(), Executors.newFixedThreadPool() returns actual instance of ThreadPoolExecutor
     * instead of mocked object
     */
    MyClass myClass = new MyClass();
    myClass.myMethod();
}