单元测试:使用Spock或Mockito模拟ThreadContext map impl

vatpfxk5  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(132)

我的方法在一个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")
    }

dsekswqp

dsekswqp1#

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()还是在你的特征方法中。

相关问题