Spring:如何测试被其他方法调用的方法的参数及对象创建?
验证emitObject()方法的三个测试点
针对调用emitObject()后需要验证的三项内容,这里用Mockito框架给出具体测试实现方案:
验证someMethod()是否被调用
通过Spy或Mock目标类,调用emitObject()后用verify方法确认someMethod是否被触发:
@Test void testEmitObjectTriggersSomeMethod() { // 假设当前类为Emitter,创建Spy对象(若someMethod是当前类方法) Emitter emitter = Mockito.spy(new Emitter()); CustomObject obj1 = new CustomObject(); CustomObject obj2 = new CustomObject(); emitter.emitObject(obj1, obj2); // 验证someMethod被调用至少一次,参数为任意anotherObject实例 Mockito.verify(emitter).someMethod(Mockito.any(anotherObject.class)); }
验证anotherObject()是否成功创建
结合ArgumentCaptor捕获传入someMethod的参数,只要捕获到的实例不为null,即可证明anotherObject已成功创建:
@Test void testEmitObjectCreatesAnotherObject() { Emitter emitter = Mockito.spy(new Emitter()); CustomObject obj1 = new CustomObject(); CustomObject obj2 = new CustomObject(); emitter.emitObject(obj1, obj2); ArgumentCaptor<anotherObject> captor = ArgumentCaptor.forClass(anotherObject.class); Mockito.verify(emitter).someMethod(captor.capture()); // 断言捕获到的实例不为null assertNotNull(captor.getValue()); }
验证anotherObject构造方法的参数值
用ArgumentCaptor捕获实例后,通过getter方法验证构造参数是否与预期一致:
@Test void testAnotherObjectHasCorrectConstructorParams() { Emitter emitter = Mockito.spy(new Emitter()); // 构造测试用的CustomObject实例并设置属性 CustomObject obj1 = new CustomObject(); obj1.setSomeProp1("expectedProp1"); obj1.setSomeProp2("expectedProp2"); CustomObject obj2 = new CustomObject(); obj2.setSomeProp1("expectedProp3"); obj2.setSomeProp2("expectedProp4"); emitter.emitObject(obj1, obj2); ArgumentCaptor<anotherObject> captor = ArgumentCaptor.forClass(anotherObject.class); Mockito.verify(emitter).someMethod(captor.capture()); anotherObject createdObj = captor.getValue(); // 验证每个构造参数对应的属性值 assertEquals("expectedProp1", createdObj.getSomeProp1()); assertEquals("expectedProp2", createdObj.getSomeProp2()); assertEquals("expectedProp3", createdObj.getSomeProp3()); assertEquals("expectedProp4", createdObj.getSomeProp4()); }
如果anotherObject未提供属性getter,也可以在verify时直接用Lambda匹配参数:
Mockito.verify(emitter).someMethod(Mockito.argThat(obj -> obj.getSomeProp1().equals("expectedProp1") && obj.getSomeProp2().equals("expectedProp2") && obj.getSomeProp3().equals("expectedProp3") && obj.getSomeProp4().equals("expectedProp4") ));
内容的提问来源于stack exchange,提问作者WhatHappenedHere
相关产品推荐
相关产品推荐

