如何在 groovy spock 测试中 return 模拟列表
How to return list for mock in groovy spock test
我在 return 从 Spock Groovy 模拟接口中获取所需对象列表时遇到问题:
public interface SomeRepository {
List<SomeObject> getAll();
}
所以我想在 class 中模拟一下:
@CompileStatic
class SomeProcessor {
private final SomeRepository repository
SomeProcessor(SomeRepository repository) {
this.repository = repository
}
List<SomeObject> getAll() {
return repository.all
}
}
我有那个测试:
class SomeProcessorSpec extends Specification {
private final SomeRepository repository = Mock(SomeRepository)
@Subject private final SomeProcessor processor = new SomeProcessor(repository)
def 'should collect items from repository'() {
given:
List<SomeObject> expected = [new SomeObject(), new SomeObject()]
repository.all >> expected
when:
List<SomeObject> actual = processor.all
then:
assertEquals(expected, actual)
}
}
当我尝试 运行 该测试时,我得到一个断言错误:
junit.framework.AssertionFailedError:
Expected :[com.example.SomeObject@1fa268de, com.example.SomeOjbect@4f6ee6e4]
Actual :null
所以这意味着从 repository.all
方法它 returned null
而不是我预期的列表,这让我感到困惑。问题是:在使用 spock 和 groovy 进行测试时,如何从模拟实例中实际 return 列出?
您可以尝试将存根部分移至交互检查阶段,例如
def 'should collect items from repository'() {
given:
List<SomeObject> expected = [new SomeObject(), new SomeObject()]
when:
List<SomeObject> actual = processor.all
then:
1 * repository.all >> expected
and:
expected == actual
}
此外,您不必使用 JUnit 的 assertEquals
- Groovy 允许您使用 ==
运算符比较两个对象。
我已经在简单的基于 Spock 的应用程序中检查了您的示例,它运行良好。我使用 Spock 0.7-groovy-2.0
、1.0-groovy-2.4
和 1.2-groovy-2.4-SNAPSHOT
对其进行了测试,适用于所有 Spock 版本。无论如何,我过去遇到过一些类似的问题,并且在这些情况下,交互检查起到了作用。希望对你有帮助。
根据白盒测试更好地测试完全相同的实现。 processor.all
returns repository.all
的结果原样。所以,最好测试一下这个事实。
根据 Szymon Stepniak 提供的正确代码,测试可以简化为:
def 'should collect items from repository'() {
given:
def expected = []
when:
def actual = processor.all
then:
1 * repository.all >> expected
and: 'make sure we got the same expected list instance'
actual.is(expected)
}
其中 .is()
我们验证相同的引用。
因此,列表的内容并不重要,它可以是空的。
我在 return 从 Spock Groovy 模拟接口中获取所需对象列表时遇到问题:
public interface SomeRepository {
List<SomeObject> getAll();
}
所以我想在 class 中模拟一下:
@CompileStatic
class SomeProcessor {
private final SomeRepository repository
SomeProcessor(SomeRepository repository) {
this.repository = repository
}
List<SomeObject> getAll() {
return repository.all
}
}
我有那个测试:
class SomeProcessorSpec extends Specification {
private final SomeRepository repository = Mock(SomeRepository)
@Subject private final SomeProcessor processor = new SomeProcessor(repository)
def 'should collect items from repository'() {
given:
List<SomeObject> expected = [new SomeObject(), new SomeObject()]
repository.all >> expected
when:
List<SomeObject> actual = processor.all
then:
assertEquals(expected, actual)
}
}
当我尝试 运行 该测试时,我得到一个断言错误:
junit.framework.AssertionFailedError: Expected :[com.example.SomeObject@1fa268de, com.example.SomeOjbect@4f6ee6e4] Actual :null
所以这意味着从 repository.all
方法它 returned null
而不是我预期的列表,这让我感到困惑。问题是:在使用 spock 和 groovy 进行测试时,如何从模拟实例中实际 return 列出?
您可以尝试将存根部分移至交互检查阶段,例如
def 'should collect items from repository'() {
given:
List<SomeObject> expected = [new SomeObject(), new SomeObject()]
when:
List<SomeObject> actual = processor.all
then:
1 * repository.all >> expected
and:
expected == actual
}
此外,您不必使用 JUnit 的 assertEquals
- Groovy 允许您使用 ==
运算符比较两个对象。
我已经在简单的基于 Spock 的应用程序中检查了您的示例,它运行良好。我使用 Spock 0.7-groovy-2.0
、1.0-groovy-2.4
和 1.2-groovy-2.4-SNAPSHOT
对其进行了测试,适用于所有 Spock 版本。无论如何,我过去遇到过一些类似的问题,并且在这些情况下,交互检查起到了作用。希望对你有帮助。
根据白盒测试更好地测试完全相同的实现。 processor.all
returns repository.all
的结果原样。所以,最好测试一下这个事实。
根据 Szymon Stepniak 提供的正确代码,测试可以简化为:
def 'should collect items from repository'() {
given:
def expected = []
when:
def actual = processor.all
then:
1 * repository.all >> expected
and: 'make sure we got the same expected list instance'
actual.is(expected)
}
其中 .is()
我们验证相同的引用。
因此,列表的内容并不重要,它可以是空的。