java - 如何模拟和验证在子类中调用的 ScheduledExecutorService 方法

标签 java unit-testing inheritance mockito scheduledexecutorservice

我有一个看起来像这样的基类:

public abstract class BaseClass implements Runnable {
 final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

 @Override
 public void run() {
     someFunction();
 }
 protected abstract void someFunction();
}

然后我有一个像这样的子类:

public class ChildClass extends BaseClass {
 functionNeedsToBeTested() {
  scheduler.scheduleAtFixedRate(this, 0L, 5L, TimeUnit.HOURS)
 }
 someFunction() {
  //Does Something
 }
}

现在问题来了,当我尝试编写测试时我无法验证 scheduleAtFixedRate 方法的调用。我的测试看起来像这样:

@RunWith(MockitoJUnitRunner.class)
public class TestClass {
 @Mock
 private ScheduledExecutorService scheduler;

 @InjectMocks
 private ChildClass obj;

 @Test
 public void testFunc() {
   obj.functionNeedsToBeTested();
   Mockito.verify(scheduler).scheduleAtFixedRate(Mockito.any(ChildClass.class, Mockito.anyLong(), Mockito.anyLong(), Mockito.any(TimeUnit.class)));
 }
}

测试给我这个错误:

junit.framework.AssertionFailedError:
    Wanted but not invoked:
    scheduler.scheduleAtFixedRate(
        <any>,
        <any>,
        <any>,
        <any>
     );

最佳答案

在您的测试中,创建了一个模拟调度程序,但它未被被测对象使用。

如果注入(inject)调度程序而不是在基类中实例化调度程序,则可以使方法可测试。例如,您可以要求调度程序作为 BaseClass 构造函数的参数

关于java - 如何模拟和验证在子类中调用的 ScheduledExecutorService 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44230609/

相关文章:

java - 如何在android中获取访问网络的UID列表

java - Spring Hibernate 处理 session 中修改查询的最佳方式

c++ - 全局变量影响单元测试结果的问题

javascript - 测试 jQuery 代码的最先进方法是什么?

scala - 案例类字段中的递归类型参数

JAVA:如何调用Object的子类中的方法?

JavaScript 类扩展

java - java中int变量的08和8之间的区别

java - 使用 Java 7 在 OSX 中创建文件的时间

c# - 无法将单元测试添加到 .NET Core 单元测试项目 VS2017