在Android应用程序中,将java类转换为kotlin,jacoco覆盖率开始显示编译器生成函数的0覆盖率,这是不可访问的。其他的在报告中似乎很好。
如何使kotlin和jacoco覆盖中字符串枚举的引用类型可测试
java代码:
public final class Message {
private Message() { }
public static class MessageAction {
public static final String OPEN = "open";
public static final String VIEW_ALL = "view_all";
@Retention(RetentionPolicy.SOURCE)
@StringDef({OPEN, VIEW_ALL})
public @interface Action { }
public String mAction;
public MessageAction(@Action String action) {
this.mAction = action;
}
public String getMessageAction() {
return this.mAction;
}
}
}
import androidx.annotation.StringDef
class Message private constructor() {
class MessageAction(@param:Action var messageAction: String) {
@kotlin.annotation.Retention(AnnotationRetention.SOURCE)
@StringDef(OPEN, VIEW_ALL)
annotation class Action
companion object {
const val OPEN = "open"
const val VIEW_ALL = "view_all"
}
}
}
public static void doSomeThing(@Nullable String message, @Message.MessageAction.Action String action) {
...
}
@Test
public void test_messageAction() {
String testAction = "open";
Message.MessageAction action = new Message.MessageAction(Message.MessageAction.OPEN);
assertEquals(testAction, action.getMessageAction());
}
kotlin反编译了java代码:
public final class Message {
private Message() {
}
@Metadata( ...... )
public static final class MessageAction {
@NotNull
private String messageAction;
@NotNull
public static final String OPEN = "open";
@NotNull
public static final String VIEW_ALL = "view_all";
public static final Message.MessageAction.Companion Companion = new Message.MessageAction.Companion((DefaultConstructorMarker) null);
@NotNull
public final String getMessageAction() {
return this.messageAction;
}
public final void setMessageAction(@NotNull String var1) { //<=== coverage result shows it is not called
Intrinsics.checkNotNullParameter(var1, "<set-?>");
this.messageAction = var1;
}
public MessageAction(@NotNull String messageAction) {
Intrinsics.checkNotNullParameter(messageAction, "messageAction");
super();
this.messageAction = messageAction;
}
@Retention(AnnotationRetention.SOURCE)
@java.lang.annotation.Retention(RetentionPolicy.SOURCE)
@Metadata( ...... )
public @interface Action {
}
@Metadata( ...... )
public static final class Companion {
private Companion() {
}
// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}
}
添加@jvmfield可解决此问题
class MessageAction(@param:Action messageAction: String) {
@kotlin.annotation.Retention(AnnotationRetention.SOURCE)
@StringDef(OPEN, VIEW_ALL, CLEAR, TOUCH3D, PLAY, PAUSE, DISMISSED)
annotation class Action
@JvmField
var messageAction: String = messageAction
companion object {
const val OPEN = "open"
const val VIEW_ALL = "view_all"
}
}
例如,我如何做类似的事情: 结果示例:
我是MVC编程的新手。所以我用的是play框架。 获取未捕获的引用Error:未定义MODERATED
问题内容: 例如,我该怎么做: 结果示例: 问题答案: 迅捷4.2+ 从Swift 4.2(使用Xcode 10)开始,只需添加协议一致性即可从中受益。要添加此协议一致性,您只需要在某处写: 如果枚举是您自己的,则可以直接在声明中指定一致性: 然后,以下代码将打印所有可能的值: 与早期Swift版本(3.x和4.x)的兼容性 如果您需要支持Swift 3.x或4.0,则可以通过添加以下代码来模仿S
我有一个枚举,我想让这些枚举类型在开关情况下成为字符串。 因此,在上面我硬编码“Mon”,而不是有一种方法,我们可以直接将枚举类型作为字符串。就目前而言,如果我在交换机案例中传递枚举类型,我将获得id 0、1或2,但我需要Mon/Tue/Wed作为字符串
主要内容:使用枚举常量枚举类最基本的用法是实现一个类型安全的枚举。 枚举常量用逗号分隔,每个枚举常量都是一个对象。 枚举初始化 每一个枚举都是枚举类的实例,它们可以被初始化: 默认名称为枚举字符名,值从0开始。若需要指定值,则可以使用其构造函数: 枚举还支持以声明自己的匿名类及相应的方法、以及覆盖基类的方法。如: 如果枚举类定义任何成员,要使用分号将成员定义中的枚举常量定义分隔开 使用枚举常量 Kotlin 中的枚举类
枚举类最基本的用法是实现一个类型安全的枚举。 枚举常量用逗号分隔,每个枚举常量都是一个对象。 enum class Color{ RED,BLACK,BLUE,GREEN,WHITE } 枚举初始化 每一个枚举都是枚举类的实例,它们可以被初始化: enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF0