如何测试使用 Basho 的 riak-java-client 的 java 代码?
How to test java code that uses Basho's riak-java-client?
我正在创建一个小型 java 服务,该服务 return 是根据所选地点列出的餐馆列表。
使用 com.basho.riak:riak-client:2.0.0 从 Riak 检索数据,读取操作包装在 TenacityCommand 中。
重要 类 如下所述,如果您能帮助我创建可靠且简单的单元测试,我将非常高兴。
命令是使用工厂创建的:
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")));
}
}
上面的类用法如下:
Place place = // Created from url parameter
RiakClient riakClient = // created on start using the app's conf
Namespace namespace = // created on start using the app's conf
FetchRestaurantsCommandFactory factory = new FetchRestaurantsCommandFactory(riakClient, namespace);
FetchRestaurantsCommand command = factory.create(place);
return command.execute();
除了 TenacityCommand
提供的功能外,我应该如何断言我的系统按预期获取数据?
我最初的想法是模拟一个 RiakClient
到 return 一个预定义的 FetchValue.Response
,然后对结果 RestaurantList
进行断言。
不幸的是,由于其设计原因,无法实例化或 Mockito.mock
a FetchValue.Response
。
中接受的答案描述了 Mockito 无法工作的原因。
据我所知,您想编写单元测试。所以你想测试假设 Response
是否正确构造了 Optional<RestaurantList>
实例。
我能想到的是将 riakClient.execute(fetchValue);
包装在受保护的(或包私有的)辅助函数中,例如:
Response fetch() {
return riakClient.execute(fetchValue);
}
然后在您的测试中,您可以继承 FetchRestaurantsCommand
并通过返回任何 Response
来覆盖 fetch
函数
现在,您可以编写任何测试来查看给定 Response
到 Optional<RestaurantList>
的转换是否按预期进行。
如果您需要完整的代码而我的解释不够清楚,请告诉我以提供它。
我最终按照@gontard 的建议使用了PowerMock。查看我在 GitHub 上的单元测试:FetchRestaurantsCommandTest.java
我考虑在 com.basho.riak.client 包中创建一个 fake/mock RiakClient。这样 class 有望以与真实客户端相同的方式实例化 Response 对象。它可能适用于 fetchValue,但当涉及更高级的 Riak 概念时它会变得太大 s.a。兄弟姐妹。
我正在创建一个小型 java 服务,该服务 return 是根据所选地点列出的餐馆列表。 使用 com.basho.riak:riak-client:2.0.0 从 Riak 检索数据,读取操作包装在 TenacityCommand 中。
重要 类 如下所述,如果您能帮助我创建可靠且简单的单元测试,我将非常高兴。
命令是使用工厂创建的:
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")));
}
}
上面的类用法如下:
Place place = // Created from url parameter
RiakClient riakClient = // created on start using the app's conf
Namespace namespace = // created on start using the app's conf
FetchRestaurantsCommandFactory factory = new FetchRestaurantsCommandFactory(riakClient, namespace);
FetchRestaurantsCommand command = factory.create(place);
return command.execute();
除了 TenacityCommand
提供的功能外,我应该如何断言我的系统按预期获取数据?
我最初的想法是模拟一个 RiakClient
到 return 一个预定义的 FetchValue.Response
,然后对结果 RestaurantList
进行断言。
不幸的是,由于其设计原因,无法实例化或 Mockito.mock
a FetchValue.Response
。
据我所知,您想编写单元测试。所以你想测试假设 Response
是否正确构造了 Optional<RestaurantList>
实例。
我能想到的是将 riakClient.execute(fetchValue);
包装在受保护的(或包私有的)辅助函数中,例如:
Response fetch() {
return riakClient.execute(fetchValue);
}
然后在您的测试中,您可以继承 FetchRestaurantsCommand
并通过返回任何 Response
fetch
函数
现在,您可以编写任何测试来查看给定 Response
到 Optional<RestaurantList>
的转换是否按预期进行。
如果您需要完整的代码而我的解释不够清楚,请告诉我以提供它。
我最终按照@gontard 的建议使用了PowerMock。查看我在 GitHub 上的单元测试:FetchRestaurantsCommandTest.java
我考虑在 com.basho.riak.client 包中创建一个 fake/mock RiakClient。这样 class 有望以与真实客户端相同的方式实例化 Response 对象。它可能适用于 fetchValue,但当涉及更高级的 Riak 概念时它会变得太大 s.a。兄弟姐妹。