单元测试:使用 Spock 或 Mockito 模拟 ThreadContext 映射实现

问题描述 投票:0回答:1

我的方法是在这样的Java类中...

   //some business logic
   String userId = org.apache.logging.log4j.ThreadContext.get("userId"); //I need mocking for this using Spock or Mockito
   //more business logic
   return map;
}

我正在尝试使用 Spock 框架为上述方法编写一个测试,而 ThreadContext 妨碍了我 - 我无法模拟它以返回我希望的字符串。我尝试在 spock 测试设置期间将自定义值放入 ThreadContext...(不起作用)

    def setupSpec() {
        ThreadContext.put("userId", "sriram")
    }
java mockito log4j spock
1个回答
1
投票

Spock 无法模拟 Java 类的静态方法,只能模拟 Groovy 类。借助 Mockito、Powermock、JMockit 或我自己的工具 Sarek 等其他工具,这是可能的。不过,如果我是你,我就不会走那条路。对我来说,您的示例代码运行完美,如下所示:

package de.scrum_master.stackoverflow.q65702384

import org.apache.logging.log4j.ThreadContext
import spock.lang.Specification

class Log4JThreadContextTest extends Specification {
  def setupSpec() {
    ThreadContext.put("userId", "sriram")
  }

  def test() {
    expect:
    ThreadContext.get("userId") == "sriram"
  }
}

所以

ThreadContext.put("userId", "sriram")
会做你想做的事。如果没有,您的问题与 Spock 无关,例如:

  • 也许您为错误的线程设置了上下文。然后您需要识别正确的线程并在那里设置上下文。
  • 也许这只是您何时设置 ID 的问题。也许在
    setupSpec()
    中你还为时过早,因为被测试的代码在执行过程中设置了相同的属性,例如在
    //some business logic
    部分。
  • 作为上一点的变体,也许您需要先初始化另一个对象,然后触发要设置的用户 ID。您自己的声明只需要在之后出现,无论是在
    setupSpec()
    setup()
    中还是在您的功能方法中的某个位置。
© www.soinside.com 2019 - 2024. All rights reserved.