我有以下结构:
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
也不会触发。
验证如何正确地进行验证但是什么时候没有触发?根据我所知,两者应该给出相同的结果。
答案 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
初始化为新的MyObject
。 eq
匹配器的引用错误,与您的新MyObject
不匹配。
首先尝试初始化mo
对象,然后然后执行when
。