我考虑了相同的功能,最终我自己通过 Mockito 框架而不是直接使用 CGLib 来实现它。听说有人在 Android Java 平台上启用了 Mockito,这样我就可以轻松地将我的使用 Mockito 的工具移植到 Android 上。但是,据我所知,目前我们无法移植任何依赖 CGLib 或 Javaassit 的函数。
我已经开源了我的名为“bimock”(双向模拟)的工具,它有两种模式。在记录模式下,它将带有返回值或异常的方法调用记录到 JSON 格式的资源文件中。在重放模式下,它在启动时从资源文件中设置方法调用和答案,并重放返回或抛出的答案。请参阅此示例,其中我记录了 Java 对象的公共方法响应并从 JSON 文件中重放它们。
您应该能够针对各种依赖项使用此工具,不仅适用于 Amazon AWS SDK 对象,还适用于 JDK 对象,例如 HashMap、ArrayList、ByteBuffer 等。
public class BimockTest {
private Mode mode = Mode.Replay;
private PojoMapper pojoMapper = new PojoMapper(new BimockModule());
private Bimock bimock = new Bimock(pojoMapper);
@Test
public void testRecordAndReplayMap() throws IOException {
val map = bimock.of(new HashMap<String, Integer>(), mode, new File("src/test/resources/test-record-and-replay-map.json"));
assertThat(map.put("abc", 3), equalTo(null));
assertThat(map.size(), equalTo(1));
assertThat(map.get("abc"), equalTo(3));
}
@Test
public void testRecordAndReplayList() {
List<Long> list = new ArrayList<Long>();
list = bimock.of(list, mode, new File("src/test/resources/test-record-and-replay-list.json"));
try {
assertThat(list.remove(-1), nullValue());
fail();
} catch (ArrayIndexOutOfBoundsException e) {
assertThat(e.getMessage(), equalTo("-1"));
}
assertThat(list.add(100L), equalTo(true));
assertThat(list.toArray(new Long[1]), equalTo(new Long[] { 100L }));
}
}