Skip to content

Record 202310

开发任务

  • 优化 Android Studio 插件
    • 运行命令时不冻结窗口
  • kotsuite-core 集成 Mock 框架
    • 使用 Java Agent + ASM 做插桩,获取函数返回值,而不是在生成 Jimple 时插桩(9.26 任务)
    • 重构代码,将可重用的逻辑进行抽离
    • 学习如何使用 Mockito 和 Robolectric
    • 实现 Mock 框架集成
    • 完成遗传算法
  • 实现测试用例去重
  • 实现测试用例重用

待优化

  • 使用线程池 ExecutorService 来执行测试用例,而不是直接通过命令行执行

记录

mock 语句对应的 Jimple

package org.example;

import static org.mockito.Mockito.*;

public class Grammar {
    public int foo() {
        return 1;
    }

    public void bar(char ch) {
        Grammar grammar = spy(Grammar.class);
        when(grammar.foo()).thenReturn(1);
    }
}
public void bar(char)
{
    org.mockito.stubbing.OngoingStubbing $r3;
    char c1;
    java.lang.Integer $r2, $r4;
    int $i0;
    java.lang.Object $r0;
    org.example.Grammar r1, r5;

    r5 := @this: org.example.Grammar;

    c1 := @parameter0: char;

    $r0 = staticinvoke <org.mockito.Mockito: java.lang.Object spy(java.lang.Class)>(class "Lorg/example/Grammar;");

    r1 = (org.example.Grammar) $r0;

    $i0 = virtualinvoke r1.<org.example.Grammar: int foo()>();

    $r2 = staticinvoke <java.lang.Integer: java.lang.Integer valueOf(int)>($i0);

    $r3 = staticinvoke <org.mockito.Mockito: org.mockito.stubbing.OngoingStubbing when(java.lang.Object)>($r2);

    $r4 = staticinvoke <java.lang.Integer: java.lang.Integer valueOf(int)>(1);

    interfaceinvoke $r3.<org.mockito.stubbing.OngoingStubbing: org.mockito.stubbing.OngoingStubbing thenReturn(java.lang.Object)>($r4);

    return;
}
  • mock object 语句创建
  • mock when 语句创建

测试数据

Data Classes: helpers.Config

共有 146 个待测函数,以 DirectoryAdapterMediaAdapter 为例。

JMockK

  • 多次调用 when 能否成功?
  • when 参数或返回值是引用类型时能否成功?
  • 实际项目中(simple-gallery)中使用 JMockK 效果如何?
  • 能否对 private 函数调用 when
  • 能否对 static 函数调用 when
  • mockStaticmockObject 的实现?

spyk调用非默认构造函数

mockkObject 方法

2023.10.20

问题:

  • 如何在 Java 中调用 mockk?
  • 如何使用 mockito 测试 Kotlin 代码?
public final void testJsonToStringList()
    {
        io.mockk.impl.JvmMockKGateway$Companion $r2;
        kotlin.reflect.KClass $r11;
        io.mockk.MockK r1;
        com.simplemobiletools.commons.helpers.Converters r13;
        io.mockk.MockKGateway$Companion $r3, $r6;
        kotlin.jvm.functions.Function0 $r4, $r7;
        kotlin.reflect.KClass[] r0;
        io.mockk.MockKDsl r5;
        io.mockk.MockKGateway $r9;
        io.mockk.MockKGateway$MockFactory $r10;
        java.lang.Object $r8, $r12;
        com.simplemobiletools.commons.helpers.ConvertersTest r14;

        r14 := @this: com.simplemobiletools.commons.helpers.ConvertersTest;

        r0 = newarray (kotlin.reflect.KClass)[0];

        r1 = <io.mockk.MockK: io.mockk.MockK INSTANCE>;

        $r3 = <io.mockk.MockKGateway: io.mockk.MockKGateway$Companion Companion>;

        $r2 = <io.mockk.impl.JvmMockKGateway: io.mockk.impl.JvmMockKGateway$Companion Companion>;

        $r4 = virtualinvoke $r2.<io.mockk.impl.JvmMockKGateway$Companion: kotlin.jvm.functions.Function0 getDefaultImplementationBuilder()>();

        virtualinvoke $r3.<io.mockk.MockKGateway$Companion: void setImplementation(kotlin.jvm.functions.Function0)>($r4);

        r5 = <io.mockk.MockKDsl: io.mockk.MockKDsl INSTANCE>;

        $r6 = <io.mockk.MockKGateway: io.mockk.MockKGateway$Companion Companion>;

        $r7 = virtualinvoke $r6.<io.mockk.MockKGateway$Companion: kotlin.jvm.functions.Function0 getImplementation()>();

        $r8 = interfaceinvoke $r7.<kotlin.jvm.functions.Function0: java.lang.Object invoke()>();

        $r9 = (io.mockk.MockKGateway) $r8;

        $r10 = interfaceinvoke $r9.<io.mockk.MockKGateway: io.mockk.MockKGateway$MockFactory getMockFactory()>();

        $r11 = staticinvoke <kotlin.jvm.internal.Reflection: kotlin.reflect.KClass getOrCreateKotlinClass(java.lang.Class)>(class "Lcom/simplemobiletools/commons/helpers/Converters;");

        $r12 = interfaceinvoke $r10.<io.mockk.MockKGateway$MockFactory: java.lang.Object mockk(kotlin.reflect.KClass,java.lang.String,boolean,kotlin.reflect.KClass[],boolean)>($r11, null, 0, r0, 0);

        r13 = (com.simplemobiletools.commons.helpers.Converters) $r12;

        return;
    }

working: ConvertersTest in Simple-Common

工作状态:

  • Chrome
  • ConvertersTest.jimple
  • Simple-gallery
  • Simple-Common
  • kotsuite-core
  • uniTest-examples
  • vscode: mockk