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 语句创建
测试数据¶
Simple-Gallery¶
Data Classes:
helpers.Config共有 146 个待测函数,以
DirectoryAdapter和MediaAdapter为例。
JMockK¶
- 多次调用
when能否成功? - 当
when参数或返回值是引用类型时能否成功? - 实际项目中(simple-gallery)中使用 JMockK 效果如何?
- 能否对
private函数调用when? - 能否对
static函数调用when? -
mockStatic和mockObject的实现?
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






