我正在创建一个自定义Matcher,用于在第三方ToggleSwitch上运行Espresso测试。我想让Espresso知道在这些开关中“选择了”哪个切换开关。
Android Studio在自定义匹配器类的红色部分下划线。问题是,项目成功构建,测试成功运行。
我不知道
为什么出现模棱两可的方法调用错误
如果存在语法错误,为什么构建成功。
这是代码
import android.view.View;
import com.llollox.androidtoggleswitch.widgets.ToggleSwitch;
import org.hamcrest.Description;
import androidx.test.espresso.matcher.BoundedMatcher;
public class ToggleSwitchMatcher extends BoundedMatcher<View, ToggleSwitch> {
private final int togglePos;
static ToggleSwitchMatcher inPosition(int togglePos){
return new ToggleSwitchMatcher(togglePos);
}
private ToggleSwitchMatcher(final int togglePos){
super(ToggleSwitch.class);
this.togglePos = togglePos;
}
@Override
protected boolean matchesSafely(ToggleSwitch item) {
return item.getCheckedPosition() == togglePos;
}
@Override
public void describeMismatch(Object item, Description description) {
super.describeMismatch(item, description);
}
@Override
public String toString() {
return super.toString();
}
@Override
public void describeTo(Description description) {
description.appendText("with checked position:").appendValue(togglePos);
}
}
此行中的括号带有下划线
return item.getCheckedPosition() == togglePos;
错误状态:
歧义方法调用。 ToggleSwitch中的getCheckedPosition()和ToggleSwitch中的getCheckedPosition()都匹配
答案 0 :(得分:1)
错误在于ToggleSwitch类中。该类声明属性var checkedPosition : Int? = null
,Kotlin将为此属性生成一个名为getCheckedPosition
和setCheckedPosition
的getter和setter。但是,该类还使用这些名称声明函数。
让我们检查一下Kotlin字节码,看看为什么编译。该属性编译为:
public final getCheckedPosition()Ljava/lang/Integer;
@Lorg/jetbrains/annotations/Nullable;() // invisible
L0
LINENUMBER 12 L0
ALOAD 0
GETFIELD com/llollox/androidtoggleswitch/widgets/ToggleSwitch.checkedPosition : Ljava/lang/Integer;
ARETURN
L1
LOCALVARIABLE this Lcom/llollox/androidtoggleswitch/widgets/ToggleSwitch; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
吸气剂编译为:
public final getCheckedPosition()I
L0
LINENUMBER 43 L0
ALOAD 0
GETFIELD com/llollox/androidtoggleswitch/widgets/ToggleSwitch.checkedPosition : Ljava/lang/Integer;
DUP
IFNULL L1
INVOKEVIRTUAL java/lang/Integer.intValue ()I
GOTO L2
L1
POP
ICONST_M1
L2
IRETURN
L3
LOCALVARIABLE this Lcom/llollox/androidtoggleswitch/widgets/ToggleSwitch; L0 L3 0
MAXSTACK = 2
MAXLOCALS = 1
由于返回类型的不同,方法签名也不同,因此JVM接受两种方法,但对于调用方来说是模棱两可的。
该类应该将getter和setter功能移到属性的get()
和set()
声明中。
答案 1 :(得分:0)
从类ToggleSwitch.kt
中删除歧义的吸气剂应使其按预期工作:
fun getCheckedPosition() : Int {
return checkedPosition ?: -1
}