Mockito何时()不开火

时间:2014-05-02 21:22:24

标签: java mockito

我有以下结构:

List<MyObject> moList = new ArrayList<MyObject>();
processor.set(moList);    //This is initialized earlier

KeyValueStore<MyObject> moStore = mock(KeyValueStore.class);
when(moStore.add(eq(expectedKey), eq(mo))).thenThrow(new RuntimeException());

processor.setMoStore(moStore);
MyObject mo = new MyObject();
mo.setEmail("abc@123");
mo.setId("123");
moList.add(mo);

processor.process();

expectedKey = MyUtils.getHex("123_abc@123");       

ArgumentCaptor<String> strArg = ArgumentCaptor.forClass(String.class);
ArgumentCaptor<MyObject> moArg = ArgumentCaptor.forClass(MyObject.class);

verify(moStore).add(strArg.capture(), moArg.capture());

assertEquals(expectedKey, strArg.getValue());
assertEquals(mo, moArg.getValue());

在这个过程中,我使用派生的期望键和mo对象在moList的成员上调用moStore.add()。这由验证捕获,assertEquals有效。但是,when()不会触发,并且异常(出于演示目的,以确保我不会错过它)不会发生。

我不确定这里发生了什么。验证和断言通过,表明add()已执行,但是从不触发。当我运行测试时,它成功完成,即使它应该抛出异常。

编辑:
我已将代码更改为建议的结构,现在它如下所示:

List<MyObject> moList = new ArrayList<MyObject>();
processor.set(moList);    //This is initialized earlier

KeyValueStore<MyObject> moStore = mock(KeyValueStore.class);

processor.setMoStore(moStore);
MyObject mo = new MyObject();
mo.setEmail("abc@123");
mo.setId("123");
moList.add(mo);

when(moStore.add(eq(expectedKey), eq(mo))).thenThrow(new RuntimeException());

processor.process();

expectedKey = MyUtils.getHex("123_abc@123");       

ArgumentCaptor<String> strArg = ArgumentCaptor.forClass(String.class);
ArgumentCaptor<MyObject> moArg = ArgumentCaptor.forClass(MyObject.class);

verify(moStore).add(strArg.capture(), moArg.capture());

assertEquals(expectedKey, strArg.getValue());
assertEquals(mo, moArg.getValue());

问题仍然存在:assertEquals评估为true,但when未触发RuntimeException。即使我将when放在process之后,或者如果我替换when(moStore.add(anyString(), any(MyObject.class))).thenThrow(new RuntimeException());when也不会触发。 验证如何正确地进行验证但是什么时候没有触发?根据我所知,两者应该给出相同的结果。

1 个答案:

答案 0 :(得分:4)

when(moStore.add(eq(expectedKey), eq(mo))).thenThrow(new RuntimeException());

processor.setMoStore(moStore);
MyObject mo = new MyObject();
mo.setEmail("abc@123");
mo.setId("123");
moList.add(mo);

您说eq(mo)然后mo初始化为新的MyObjecteq匹配器的引用错误,与您的新MyObject不匹配。

首先尝试初始化mo对象,然后然后执行when