Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何测试使用Basho';RIAKJava客户端?_Java_Unit Testing_Riak - Fatal编程技术网

如何测试使用Basho';RIAKJava客户端?

如何测试使用Basho';RIAKJava客户端?,java,unit-testing,riak,Java,Unit Testing,Riak,我正在创建一个小型java服务,它根据所选地点返回餐厅列表。 使用com.basho.Riak:Riak client:2.0.0从Riak检索数据,读取操作包装在一个TextantyCommand中 下面描述了一些重要的类,如果您能帮助我创建一个坚实而简单的单元测试,我将非常高兴 使用工厂创建命令: package service.command.factory; import com.basho.riak.client.api.RiakClient; import com.basho.ri

我正在创建一个小型java服务,它根据所选地点返回餐厅列表。 使用com.basho.Riak:Riak client:2.0.0从Riak检索数据,读取操作包装在一个TextantyCommand中

下面描述了一些重要的类,如果您能帮助我创建一个坚实而简单的单元测试,我将非常高兴

使用工厂创建命令:

package service.command.factory;

import com.basho.riak.client.api.RiakClient;
import com.basho.riak.client.api.commands.kv.FetchValue;
import com.basho.riak.client.core.query.Location;
import com.basho.riak.client.core.query.Namespace;

import domain.Place;
import service.command.FetchRestaurantsCommand;

public class FetchRestaurantsCommandFactory {

    private final RiakClient riakClient;
    private final Namespace namespace;

    public FetchRestaurantsCommandFactory(final RiakClient riakClient, final Namespace namespace) {
        this.riakClient = riakClient;
        this.namespace = namespace;
    }

    public FetchRestaurantsCommand create(final Place place) {
        Location location = new Location(namespace, place.getName());
        FetchValue riakCommand = new FetchValue.Builder(location).build();
        return new FetchRestaurantsCommand(riakClient, riakCommand);
    }
}
命令如下所示:

package service.command;

import java.util.Optional;

import service.command.keys.WhereToEatDependencyKeys;

import com.basho.riak.client.api.RiakClient;
import com.basho.riak.client.api.commands.kv.FetchValue;
import com.basho.riak.client.api.commands.kv.FetchValue.Response;
import com.yammer.tenacity.core.TenacityCommand;

import domain.Restaurant;
import domain.RestaurantList;

public class FetchRestaurantsCommand extends TenacityCommand<Optional<RestaurantList>>{

    private final RiakClient riakClient;
    private final FetchValue fetchValue; 

    public FetchRestaurantsCommand(RiakClient riakClient, FetchValue fetchValue) {
        super(WhereToEatDependencyKeys.RIAK_GET_RESTAURANTS);
        this.fetchValue = fetchValue;
        this.riakClient = riakClient;
    }

    @Override
    protected Optional<RestaurantList> run() throws Exception {
        Response response = riakClient.execute(fetchValue);
        return Optional.ofNullable(response.getValue(RestaurantList.class));
    }

    @Override
    protected Optional<RestaurantList> getFallback() {
        return Optional.of(RestaurantList.createFallback(new Restaurant("My failure suggestion")));
    }

}
除了TensityCommand提供的功能外,我应该如何断言我的系统按照Expected获取数据

我最初的想法是模拟一个
RiakClient
来返回一个预定义的
FetchValue.Response
,然后在结果
RestaurantList
上进行断言。 不幸的是,由于设计原因,无法实例化或
Mockito.mock
a
FetchValue.Response


中的公认答案描述了Mockito无法工作的原因。

据我所知,您希望编写单元测试。因此,您需要测试假设一些
响应
是否正确构造了
可选
实例。 我能想到的是包装
riakClient.execute(fetchValue)在受保护(或包专用)辅助函数中,如:

Response fetch() {
  return riakClient.execute(fetchValue);
}
然后在测试中,您可以从
fetchrestaurantcommand
继承,并通过返回任何
响应来重写
fetch
函数

现在,您可以编写任何测试来查看给定的
响应
可选
的转换是否按预期进行


如果您需要完整的代码,而我的解释不够清楚,请告诉我如何提供。

我最终按照@gontard的建议使用了PowerMock。请参阅我在GitHub上的单元测试:


我考虑在com.basho.riak.client包中创建一个假/模拟RiakClient。这样的类有望以与实际客户机相同的方式实例化响应对象。它可能适用于fetchValue,但当涉及更高级的Riak概念s.a.兄弟时,它会变得太大。

您是否看过Riak开发人员如何对自己的类进行单元测试?可能会有帮助吗?好主意!不幸的是,他们的FetchValue测试如下所示://TODO:对此进行处理。您无法模拟响应,因为父类不是public@Ignore public类FetchValueTest:(可能是某种集成测试,也可能是一种方法。另一个选项可能是尝试powermock。问题是无法实例化响应对象。重写fetch()的类没有办法创建它的返回值。如果我理解正确,您的解决方案将完美工作,如果它是难以创建的FetchValue。
Response fetch() {
  return riakClient.execute(fetchValue);
}