单元测试:使用Spock或Mockito的mock ThreadContext映射impl



我的方法在这样的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无关,例如:

  • 也许您为错误的线程设置了上下文。然后,您需要确定正确的线程,并在那里设置上下文
  • 也许这只是你何时设置ID的问题。也许在setupSpec()中,你只是太早了,因为你正在测试的代码在执行过程中设置了相同的属性,例如在//some business logic部分
  • 作为前一点的变体,您可能需要首先初始化另一个对象,然后触发要设置的用户ID。无论是在setupSpec()setup()中还是在特性方法中的某个地方,您自己的语句都需要在之后出现

只有你的伪代码,没有MCVE,很难说什么,因为我无法重现这个问题。有太多的猜测空间,所以请学习如何提出好的问题,从上一句中的链接开始。🙂

最新更新