当前位置: 首页 > 知识库问答 >
问题:

如何使kotlin和jacoco覆盖中字符串枚举的引用类型可测试

缑修齐
2023-03-14

在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();
            }
        }
    }
}

共有1个答案

鄢朝斑
2023-03-14

添加@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