如何用JUnit Mockito测试含私有方法的无返回值方法并解决交互异常
问题分析与解决方案
核心问题
你的测试代码存在两个关键错误:
- 被测试类
Container被声明为@Mock对象——Mock对象的方法默认是空实现,且你从未调用过container.checkAndUpdate()方法,导致verify时提示"无交互"。 - 未正确Stub依赖对象
Service的getAddress()方法——原代码中service.setAddress(addList)无法让service.getAddress()返回预设列表,因为Mock对象的方法返回值需要显式指定。
修正方案
基础测试(验证public方法逻辑)
不需要Mock被测试类Container,直接创建真实实例,仅Mock依赖的Service并Stub其方法,调用真实方法后验证逻辑结果:
import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import java.util.ArrayList; import java.util.List; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class ContainerTest { // 创建真实的被测试类实例 private Container container = new Container(); // 仅Mock依赖的Service对象 @Mock private Service service; @Test public void testCheckAndUpdate() { List<Address> addList = new ArrayList<>(); // 可根据测试需求添加测试用的Address对象 // addList.add(new Address("test")); Actual actual = new Actual(); actual.setValue("TA"); // Stub Service的getAddress方法,返回预设的列表 when(service.getAddress()).thenReturn(addList); // 调用被测试类的真实方法 container.checkAndUpdate(service, actual); // 验证逻辑结果(示例:如果somePrivateMethod会修改addList,检查其状态) // Assert.assertEquals(预期值, addList.size()); } }
验证私有方法执行(可选)
如果必须验证私有方法somePrivateMethod是否被调用,需要引入PowerMock支持:
- 添加PowerMock依赖(根据你的构建工具调整)
- 修改测试类配置:
import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import java.util.ArrayList; import java.util.List; import static org.mockito.Mockito.when; @RunWith(PowerMockRunner.class) @PrepareForTest(Container.class) // 指定需要处理的类 public class ContainerTest { private Container container = new Container(); @Mock private Service service; @Test public void testCheckAndUpdate() throws Exception { List<Address> addList = new ArrayList<>(); Actual actual = new Actual(); actual.setValue("TA"); when(service.getAddress()).thenReturn(addList); container.checkAndUpdate(service, actual); // 验证私有方法被调用,传入指定参数 PowerMockito.verifyPrivate(container).invoke("somePrivateMethod", addList); } }
内容的提问来源于stack exchange,提问作者Jeet
相关产品推荐
相关产品推荐

