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

斯波克没有正确地嘲笑混凝土类?

娄建义
2023-03-14

我在一个Java项目中工作,并开始使用Spock框架在Groovy中编写单元测试。但我对Spock的嘲讽功能有意见,希望有人能找出我做错了什么。

public class FooContext {
  private Object foo = new Object();
  public Object getFoo() {
    return foo;
  }
}

public abstract class HasFooContext {
  private FooContext fooContext;
  public void setFooContext(FooContext fooContext) {
    this.fooContext = fooContext;
  }
  public Object getFoo() {
    Object foo = fooContext.getFoo();
    assert foo != null : "no foo available";
    return foo;
  }
}

public class FooService extends HasFooContext {
  public void doFoo() {
    getFoo();
  }
}
public class FooServiceJavaUnitTest {

  private FooContext fooContext;
  private FooService fooService;

  @Before
  public void setup() {
    Object foo = new Object();

    fooContext = mock(FooContext.class);
    when(fooContext.getFoo()).thenReturn(foo);

    fooService = new FooService();
    fooService.setFooContext(fooContext);
  }

  @Test
  public void doFooInvokesGetFoo() {
    fooService.doFoo();
    verify(fooContext, times(1)).getFoo();
  }

}

然后,我使用Spock在Groovy中编写了以下单元测试:

class FooServiceGroovyUnitTest extends Specification {

  private FooContext fooContext;
  private FooService fooService;

  def setup() {
    // Create a mock FooContext.
    fooContext = Mock(FooContext)
    fooContext.getFoo() >> new Object()

    fooService = new FooService()
    fooService.fooContext = fooContext
  }

  def "doFoo invokes getFoo"() {
    when: "call doFoo"
    fooService.doFoo()

    then: "getFoo is invoked"
    1 * fooContext.getFoo()
  }

}

此测试失败如下:

dofoo调用getfoo:21没有可用的foo

public abstract class HasFooContext {
  ...
  public Object getFoo() {
    Object foo = fooContext.getFoo();
    assert foo != null : "no foo available";
    return foo;
  }
}
class FooServiceGroovyUnitTest extends Specification {
  ...
  def setup() {
    // Spy on a real FooContext.
    fooContext = Spy(FooContext)

    fooService = new FooService()
    fooService.fooContext = fooContext
  }
}

共有1个答案

经炜
2023-03-14

对相同交互的嘲讽和反驳需要发生在相同的语句中:

1 * fooContext.getFoo() >> new Object()

大多数其他Java模仿框架(除了Mockito之外)的行为方式都是一样的。有关此行为的更多详细信息,请参阅官方文档。

 类似资料:
  • 我在spock框架测试方面是非常新的,我没有找到任何可以找到所需信息的例子。因此,我认为最好的方法是向一个例子展示我需要拥有的东西。 > 例如。斯波克的测试类: 将数据作为域类: 现在我有了测试,并且想模拟唯一的方法。这意味着每次调用时,都需要有msg成功的对象数据,但是方法中的所有其他方法都应该正常调用。 很可以理解吗?问题是如何将服务类注入/模拟到spock测试类中?

  • 我有Kotlin课程和Groovy/Spock测试。当我模拟一个Kotlin类并在该模拟上设置一个属性值时,它无法传递到Kotlin。 下面是一个Kotlin实体类,以及一个使用它的类: 已经尝试过: 使用GroovyStub()而不是GroovyMock()-没有区别 使用Mock()/stub()而不是GroovyMock()-那么该属性在所有println的even Groovy(!!?)

  • 我是Mockito的新手,正在尝试模拟服务方法。但是,Mockito无法正确模拟函数。 以下是部分测试代码: 课程: 我期待返回一个非空列表。但是,它返回了一个空列表。有人能帮忙吗?

  • 我有一个Spring MVC应用程序。它有控制器、服务和Dao。我只想通过使用Mockito模拟DAO层来测试控制器和服务。 我的控制器类: 我的服务类: 我的测试类: 问题:通过自动连线控制器和服务,它可以很好地执行通话。然而,从服务中,DAO调用的是一个真正的DAO,而不是模拟的DAO。 > 在控制器中保留道并对控制器使用@InjectMock可以正常工作,但是我想在服务中保留道,并且只测试控

  • 以下是日志供参考: IllegalStateException:无法转换名为com.xyz.TestLoad的类。原因:java.io.ioException:无效常量类型:在org.powermock.core.classloader.mockClassLoader.loadModifiedClass(MockClassLoader.java:180)在org.powermock.core.cl

  • 我提到了这个答案,我该如何模拟java。时间本地日期。now()关于如何模拟我的LocalDateTime。now()调用。我基本上遵循了所有步骤,但只使用了LocalDateTime而不是LocalDate。 我的代码的功能是这样的,它应该只在一小时的第15或45分钟运行。因此,我将LOCAL\u DATE\u TIME静态变量设置为: 然后在我的@Before测试方法中,我有以下内容: 这是2