Unit testing 无法在单独的类中获取Executor的模拟实例
我试图模拟java.util.concurrent包中的ExecutorService和Executor 如果我尝试在模拟对象的同一个类(测试类)中获取对象,我就能够获得模拟对象。但是,如果我尝试在不同的类(我要测试的类)中获取模拟对象,那么它将从java.util.concurrent返回实际对象。下面是代码片段 我要测试的类: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
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();
}