我的方法是在这样的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")
}
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 无关,例如:
setupSpec()
中你还为时过早,因为被测试的代码在执行过程中设置了相同的属性,例如在 //some business logic
部分。setupSpec()
、setup()
中还是在您的功能方法中的某个位置。