当前位置: 首页 > 知识库问答 >
问题:

将模拟代码重构到另一个类中会导致Spock测试失败

邹斌
2023-03-14

我有一个Groovy/Spock单元测试,如下所示:

public class ThingUnitTest extends Specification {

  def "doing a thing delegates to the context"() {
    given : def thing = createThing()
    when  : thing.doThing()
    then  : 1 * thing.context.doThing()
  }

  def createThing() {
    def thing = new ThingImpl()
    thing.context = createThingContext()
    return thing
  }

  def createThingContext() {
    def context = Spy(ThingContext)
    context.foo = Mock(Foo)
    context.bar = Mock(Bar)
    return context
  }
} 

这个测试将不会出现问题。但是,我有其他测试需要ThingContext,所以我想将CreateThingContext代码移到一个公共类中:

public class ThingContextFactory extends Specification {
  def createThingContext() {
    def context = Spy(ThingContext)
    context.foo = Mock(Foo)
    context.bar = Mock(Bar)
    return context
  }
} 
public class ThingUnitTest extends Specification {
  ...
  def createThingContext() {
    return new ThingContextFactory().createThingContext()
  }
} 
public class ThingContextFactory {
  def createThingContext() {
    def mocking = new MockingApi()
    def context = mocking.Spy(ThingContext)
    context.foo = mocking.Mock(Foo)
    context.bar = mocking.Mock(Bar)
    return context
  }

请注意,我不想在这里使用继承,而是将常见的模仿代码移到帮助器类中。但当我这么做的时候,我的斯波克测试失败了。

有什么适当的方法来重构Spock嘲笑代码吗?

共有1个答案

连鸿
2023-03-14

在Spock0.7中,模拟对象只能在使用它们的测试类或其超类中创建。这可能会在下一个版本中改变。

 类似资料:
  • 我用代码编写了以下旧方法,用于访问服务类中的请求对象,例如:

  • 我在这里面临一个非常奇怪的问题。 以下是我的测试课程: SearchViewModel。Java语言 这里的测试用例工作得非常好,直到我删除了行

  • 我最近才开始为我们的web应用程序创建Geb/Spock测试,并且--考虑到我对Geb、Spock和所有Groovy的知识有限--遇到了一个毫无意义的错误(考虑到我的Java经验)。 因此,下面是有问题的模块: 那里没什么特别的。 以下是这一页(不过,我不确定这是如何结合在一起的): 根据Erdi的回答,BugSpec的超类也包括在内:

  • 在我的JavaFX应用程序中,我使用Spock和Groovy进行测试。我有专门的来处理我的JavafX组件。我想测试一些依赖于当前位置和文档的功能。 WebBrowserController的相关部分: 这就是我为测试创建实例的方法。注意我在这里使用的-普通不适用于final类,而是final类。 下面的线正在测试中,它断了。我希望“一些随机字符串”返回,但我只是得到失败的测试和NPE。 现在,有

  • 问题内容: 我正在为具有两个方法methodA,methodB的类编写JUnit测试用例。我想在测试用例中模拟对methodA的methodB调用,我正在对正在测试的类使用间谍,但仍然执行methodB。 这是课程 这是测试课 尽管我已对其进行了模拟,但方法B仍会得到调用。请向我建议一个使用正确方法模拟同一类methodA的methodB调用的解决方案。 问题答案: 我昨天碰到这个,因为间谍最好做

  • 我创建了两个相当长的函数,它们创建了一个AlertDialogBuilder,AlertDialogBuilder创建了一个已填充并启动的AlertDialog。生成的警报对话框对于对话框来说相当大,因此需要在对话框中填充大量视图。出于清洁性、可测试性、SRP等方面的考虑,我决定将这些函数移到一个新的类中。 原来函数直接放在Activity类中,警报对话框启动得很好。现在,我将两者都移到了一个Al