You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:45:33