Android 如何在意式浓缩咖啡的RatingBar上设置特定等级?
我正在试着写一个浓缩咖啡测试,测试一个分级条的选择。如何使用浓缩咖啡设置特定的评分?我只看到Android 如何在意式浓缩咖啡的RatingBar上设置特定等级?,android,android-espresso,ratingbar,Android,Android Espresso,Ratingbar,我正在试着写一个浓缩咖啡测试,测试一个分级条的选择。如何使用浓缩咖啡设置特定的评分?我只看到click(),它总是设置中间评级。您需要创建ViewAction的自定义子类,在视图上调用setRating,然后将自定义视图操作的实例传递给perform()方法。接受的答案帮助我编写了以下自定义ViewAction: public final class SetRating implements ViewAction { @Override public Matcher<Vi
click()
,它总是设置中间评级。您需要创建ViewAction的自定义子类,在视图上调用setRating,然后将自定义视图操作的实例传递给perform()方法。接受的答案帮助我编写了以下自定义ViewAction:
public final class SetRating implements ViewAction {
@Override
public Matcher<View> getConstraints() {
Matcher <View> isRatingBarConstraint = ViewMatchers.isAssignableFrom(RatingBar.class);
return isRatingBarConstraint;
}
@Override
public String getDescription() {
return "Custom view action to set rating.";
}
@Override
public void perform(UiController uiController, View view) {
RatingBar ratingBar = (RatingBar) view;
ratingBar.setRating(3);
}
}
public final类SetRating实现ViewAction{
@凌驾
公共匹配器getConstraints(){
Matcher isRatingBarConstraint=ViewMatchers.isAssignableFrom(RatingBar.class);
返回为RATINGBARCONSTRAINT;
}
@凌驾
公共字符串getDescription(){
返回“自定义视图操作以设置分级。”;
}
@凌驾
公共作废执行(UiController UiController,视图){
RatingBar RatingBar=(RatingBar)视图;
额定杆设置(3);
}
}
您也可以向视图的正确部分发送点击事件,而不是在自定义视图操作中调用设置评级
这意味着您可以在生产代码中使用boolean fromUser
参数,避免在设置评级之前将评级条更改侦听器设置为null:
ratingBar.setRating(viewModel.rating());
ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
if (fromUser) {
viewModel.actions().onRate(rating);
}
}
});
以下操作对我来说已经足够了,因为我的评级栏设置为0.5级,总共有5颗星:
RateableMovieViewModel viewModel = viewModel(userActions).build();
rateableMovieViewHolder.bind(viewModel);
onView(withId(R.id.item_rateable_rating)).perform(setRating(4.5f));
verify(userActions).onRate(4.5f);
private static view动作设置等级(最终浮动等级){
如果(额定值%0.5!=0){
抛出新的IllegalArgumentException(“评级必须是0.5f的倍数”);
}
返回新的ViewAction(){
@凌驾
公共匹配器getConstraints(){
返回isAssignableFrom(RatingBar.class);
}
@凌驾
公共字符串getDescription(){
返回“以0.5f的增量在额定杆上设置额定值”;
}
@凌驾
公共作废执行(UiController UiController,视图){
GeneralClickAction viewAction=新建GeneralClickAction(
单打,
新的协调人提供者(){
@凌驾
公共浮动[]计算坐标(视图){
int[]位置屏幕上=新int[2];
v、 GetLocationOn屏幕(LocationOn屏幕);
int screenX=屏幕上的位置[0];
int screenY=屏幕上的位置[1];
int numStars=((评级栏)视图).getNumStars();
float-widthPerStar=1f*view.getWidth()/numStars;
浮动百分比=额定值/numStars;
float x=screenX+view.getWidth()*百分比;
float y=screenY+view.getHeight()*0.5f;
返回新的浮点[]{x-widthPerStar*0.5f,y};
}
},
按手指,
InputDevice.SOURCE_未知,
MotionEvent.BUTTON_主
);
viewAction.perform(uiController,视图);
}
};
}
isAssignableFrom在这里做什么?@karate你可以在这里找到它:@appoli谢谢你的回答,如果你将它改为ViewMatchers,它会很清楚。isAssignableFrom(RatingBar.class)是现成的!非常感谢。
private static ViewAction setRating(final float rating) {
if (rating % 0.5 != 0) {
throw new IllegalArgumentException("Rating must be multiple of 0.5f");
}
return new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return isAssignableFrom(RatingBar.class);
}
@Override
public String getDescription() {
return "Set rating on RatingBar in 0.5f increments";
}
@Override
public void perform(UiController uiController, View view) {
GeneralClickAction viewAction = new GeneralClickAction(
Tap.SINGLE,
new CoordinatesProvider() {
@Override
public float[] calculateCoordinates(View view) {
int[] locationOnScreen = new int[2];
v.getLocationOnScreen(locationOnScreen);
int screenX = locationOnScreen[0];
int screenY = locationOnScreen[1];
int numStars = ((RatingBar) view).getNumStars();
float widthPerStar = 1f * view.getWidth() / numStars;
float percent = rating / numStars;
float x = screenX + view.getWidth() * percent;
float y = screenY + view.getHeight() * 0.5f;
return new float[]{x - widthPerStar * 0.5f, y};
}
},
Press.FINGER,
InputDevice.SOURCE_UNKNOWN,
MotionEvent.BUTTON_PRIMARY
);
viewAction.perform(uiController, view);
}
};
}