如何从类实例到mock的静态方法

时间:2016-03-10 09:41:17

标签: scala unit-testing mockito scalatest

我需要存根Java.util.concurrent.Executors类newFixedThreadPool方法并验证它。

    Executors.newFixedThreadPool(executorServiceThreadCount, threadFactory)

我尝试创建一个全局Executors值来覆盖测试片段。

    lazy val executors = Executors

但是无法从执行程序实例访问newFixedThreadPool方法。 我应该怎么做才能破坏这种方法。对此最好的做法是什么?感谢

2 个答案:

答案 0 :(得分:0)

您可以使用PowerMockito来模拟静态方法。在测试类之上使用以下注释:

@RunWith(PowerMockRunner.class) @PrepareForTest({Executors.class, ClassYouAreTesting.class})

并使用以下代码模拟newFixedThreadPool方法:

PowerMockito.mockStatic(Executors.class); Mockito.when(Executors.newFixedThreadPool(5)).thenReturn(mockService);

答案 1 :(得分:0)

newFixedThreadPool方法可能已经过测试,因此我不会花太多时间来测试它。

相反,我会假设您实际尝试做的是测试使用newFixedThreadPool返回类型(ExecutorService)的类。 如果是这种情况,那么您有几个选择:

  1. 使用依赖注入并创建集成测试样式 - 您可以做的是将ExecutorService传递给您正在测试的类(您可以使用构造函数或setter来实现。我通常将它传递给构造函数但是这是一个完全不同的主题)然后传递ExecutorService模拟。 我得说,过去我曾尝试过模拟ExecutorService代码,但这并不是很有趣。这种方法的优点是您还可以测试线程之间的交互,从而测试更能反映真实场景的场景。
  2. 更多的单元测试方法是测试线程池中线程调用的代码(您即将运行的可调用/可运行代码)。这更容易编写,绝对更加孤立。这里的缺点是你没有测试你的线程之间的所有交互。
  3. 我应该补充一些事项:

    • 我倾向于不喜欢所有这些允许你做一些魔术技巧的电动工具(例如嘲弄静态方法等),不是因为它们不够强大,而是因为它只是感觉如果你需要这么大的力量为了测试一些东西,那么你的设计可能有问题
    • 我故意避免使用setter /构造函数注入和集成/单元测试等热门话题,因为我觉得它超出了范围
    • 我经常尝试避免(如果可能的话)在我的线程之间共享资源,这样我就不会从采用更多集成风格的方法中获益(在这些情况下)

    我希望这会有所帮助:)