首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试:使用Spock或Mockito的模拟ThreadContext映射

单元测试:使用Spock或Mockito的模拟ThreadContext映射
EN

Stack Overflow用户
提问于 2021-01-13 12:53:15
回答 1查看 960关注 0票数 1

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

代码语言:javascript
复制
   //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却阻碍了我的工作--我无法模仿它来返回我所希望的字符串。我试图在ThreadContext测试的安装过程中将一个自定义值放入.(没有工作)

代码语言:javascript
复制
    def setupSpec() {
        ThreadContext.put("userId", "sriram")
    }

任何想法都很感谢,谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-14 02:35:37

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

代码语言:javascript
复制
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,就很难再说什么了,因为我无法重现问题。有太多的空间来推测,所以请学习如何问好问题,从前一句中的链接开始。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65702384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档