问题:是否有任何工具可以自动化固执或模拟对象响应(使用JMOCK,MOCKITO或EASE MOCK)? 我必须针对具有对亚马逊AWS服务(SQS/简单队列服务和DynamoDB)的方法编写单元测试。固执的模拟对象响应往往非常乏味,很难维持我。因此,我认为,如果我们使用Java代理(Over Cglib或Javassist)记录和重播Stubbed响应会很好。我考虑过自己实施这样的想法,但是我想检查是否有人实施了这样的想法。
easymock在过去做到了这一点,但是我们发现随着代码的变化,这种测试往往很脆弱。我的经验是,如果在测试中维持存根是乏味的,那么这是关于应该聆听的测试代码设计的线索。那里可能应该有更多较小的对象。
如果您的代码与SQS/DynamoDB进行交互,然后编写实际使用SQS和DynamoDB的集成测试 - 它们将为您提供比单位测试更高的置信度,并且不会变得脆弱。 DynamoDB还具有内存本地实例,您可以为此目的旋转
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 }));
}
}