gpt4 book ai didi

java - 如何将模拟对象注入(inject)构造函数?

转载 作者:行者123 更新时间:2023-11-30 08:35:10 25 4
gpt4 key购买 nike

我刚刚开始研究用于 Java 应用程序的 Spock 测试框架。我以前没有使用 Groovy 的经验。我们如何使用 Spock 框架将 mock 注入(inject)构造函数?下面是我的代码和测试示例。

public class ResourceClass {
private final IDynamoDBMapper factory = new DefaultDynamoDBClientFactory(DynamoDBConfig.fromProperties()).mapperClient();

private ServiceClass service;

@Inject
public ResourceClass(ServiceClass service) {
this.service = service;
}
}

我尝试创建如下所示的测试类。

class ResourceClassTest extends Specification {
ResourceClass eventsResource
ServiceClass service

def setup() {
service = Mock(ServiceClass)
eventsResource = new ResourceClass(service)
}

但是我在 eventsResource = new ResourceClass(service) 时遇到异常

java.lang.NullPointerException: Domain name must be specified.

at java.util.Objects.requireNonNull(Objects.java:228)

有什么建议吗?

最佳答案

问题不在于将模拟“注入(inject)”到 ResourceClass 的构造函数中,因为您只是调用传入模拟的构造函数。出现这个异常的原因是因为这个字段声明+初始化:

private final IDynamoDBMapper factory = new DefaultDynamoDBClientFactory(DynamoDBConfig.fromProperties()).mapperClient();

工厂字段的初始化将发生在构造函数执行之前(它实际上会在编译期间被复制到构造函数的开头)。

您可以检查工厂初始化失败的原因(例如检查 DynamoDBConfig.fromProperties() 的工作方式以及应该在何处指定 dynamo 数据库连接的域属性)或者您可以修改源代码以与处理服务相同的方式通过构造函数将工厂对象注入(inject) Resource 类,然后在测试中将 IDynamoDBMapper 的模拟传递到服务构造函数中:

public class ResourceClass {
private final IDynamoDBMapper factory;
private ServiceClass service;

@Inject
public ResourceClass(ServiceClass service, IDynamoDBMapper factory) {
this.service = service;
this.factory = factory;
}
}

class ResourceClassTest extends Specification {
ResourceClass eventsResource
ServiceClass service
IDynamoDBMapper mapper

def setup() {
service = Mock(ServiceClass)
mapper = Mock(IDynamoDBMapper)
eventsResource = new ResourceClass(service, mapper)
}
}

使用第二种解决方案,您可以更好地控制 Resource 类的测试,但第一种解决方案应该更容易

关于java - 如何将模拟对象注入(inject)构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38406037/

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