gpt4 book ai didi

java - "Too few invocations"但方法被调用并且所有内容都是使用 GroovySpy 或 GroovyMock 创建的

转载 作者:行者123 更新时间:2023-12-02 04:17:59 26 4
gpt4 key购买 nike

我有这样的类(class):

class A(B b, C c, D d, E e) {

protected void doSth() {
test();
}

protected void test() {
System.out.println("test");
}
}

我正在尝试测试是否调用了 doSth() 方法,然后也调用了 test() 方法。方法的返回类型为 void,因此我无法测试这些方法的结果。

我的测试看起来像这样

    def "test when doSth"() {
given: 'A class'
A aClass = GroovySpy(A, constructorArgs: [GroovyMock(B), GroovyMock(C), GroovyMock(D), GroovyMock(E)) as A

when:
A.doSth()

then:
1 * A.test()
}

但是这个测试不起作用。它给我测试方法的“调用次数太少”错误。我真的很困惑,因为完全相同的示例但构造函数中没有参数可以完美地工作。

最佳答案

首先,我不知道你的Java类有什么样的语法。我猜它不是真正的 Java,但可能是类似 Kotlin 的东西?我不知道,说到 JVM 语言,我只讲 Java 和 Groovy。因此,让我重新创建您的测试主题,如下所示:

package de.scrum_master.stackoverflow.q56652868;

public class A {
private B b;
private C c;
private D d;
private E e;

public A(B b, C c, D d, E e) {
this.b = b;
this.c = c;
this.d = d;
this.e = e;
}

protected void doSth() {
test();
}

protected void test() {
System.out.println("test");
}

public static class B {}
public static class C {}
public static class D {}
public static class E {}
}

我希望这没问题。

至于您的测试,我不确定测试此交互(由 doSth() 调用的方法 test()) 是否对您的应用程序确实至关重要,并且应该首先进行了测试。我认为这种交互测试对于某些设计模式很重要,例如,想要检查是否例如当特定的事情发生时,主体会通知某些注册的观察者。测试类的内部连接,尤其是非公共(public)方法,通常没有多大好处,并且可能导致过度规范和脆弱的测试,如果不是类的公共(public) API 而只是内部实现更改,则需要经常更新。

话虽如此,出于教育目的,现在让我回答您的问题。

<小时/>

您的测试中有几处错误:

  • 语法错误。您在定义 Groovy spy 的行中缺少构造函数参数列表的结束 ]
  • 这并不是一个错误,但为什么要过度指定 spy 的类型呢?您可以 3 倍确保它确实是一个 A,而不是 A aClass = GroovySpy(A, ...) as A。为什么不只是 A aClass = GroovySpy(...) 或者 def aClass = GroovySpy(A, ...)?无需通过 as AA 转换为自身。
  • 不要使用 Groovy 模拟和 spy ,普通的 Spock 模拟和 spy 即可。您不需要高级的 Groovy 模拟功能,而且对于本身未在 Groovy 中实现的目标类,这些功能无论如何都不起作用,如 Spock 手册中所述。他们的行为就像正常的 Spock 模拟一样。
  • 最后但并非最不重要的一个真正的错误是:您编写 A.doSth()A.test() 就好像您正在处理静态方法一样。为什么?您需要编写 aClass.doSth()aClass.test(),然后您的测试就会通过:
package de.scrum_master.stackoverflow.q56652868

import de.scrum_master.stackoverflow.q56652868.A.B
import de.scrum_master.stackoverflow.q56652868.A.C
import de.scrum_master.stackoverflow.q56652868.A.D
import de.scrum_master.stackoverflow.q56652868.A.E
import spock.lang.Specification

class ATest extends Specification {
def "test when doSth"() {
given: 'A class'
A aClass = Spy(constructorArgs: [Mock(B), Mock(C), Mock(D), Mock(E)])

when:
aClass.doSth()

then:
1 * aClass.test()
}
}

关于java - "Too few invocations"但方法被调用并且所有内容都是使用 GroovySpy 或 GroovyMock 创建的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56652868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com