Mockito 1.9.5构造传参Mock:需Mock外部方法的测试问题
使用Mockito 1.9.5测试MyClass并Mock内部方法
针对你的需求——测试MyClass同时Mock掉它的getStringFromExternalSources方法,在Mockito 1.9.5里我们可以用**部分Mock(Spy)**来实现,既能保留类里其他方法的真实逻辑,又能替换掉依赖外部资源的方法。
核心思路
因为你需要测试的是MyClass本身的逻辑,而不是完全Mock整个类,所以用spy()包装真实的MyClass对象是最合适的。这样除了我们指定Mock的方法外,其他方法都会执行真实代码。另外要注意,在Mockito 1.9.5里,推荐用doReturn().when()的方式来Mock方法,避免不小心触发真实方法的调用(比如这个依赖外部资源的方法,调用真实逻辑可能会影响测试稳定性)。
完整测试代码示例
@RunWith(MockitoJUnitRunner.class) public class MyClassTest { @Test public void testExecuteLogicAndMockExternalMethod() { // 1. 创建真实MyClass对象的Spy实例 MyClass myClassSpy = spy(new MyClass("Hello", "World", "!")); // 2. Mock getStringFromExternalSources方法,返回我们自定义的测试值 doReturn("Mocked External Content").when(myClassSpy).getStringFromExternalSources(); // 3. 测试executeLogic方法,验证真实逻辑是否正常工作 String executeResult = myClassSpy.executeLogic(" Test"); assertEquals("HelloWorld! Test", executeResult); // 4. 验证Mock方法的返回值是否符合预期 String externalResult = myClassSpy.getStringFromExternalSources(); assertEquals("Mocked External Content", externalResult); } }
关键细节说明
@RunWith(MockitoJUnitRunner.class):用来让JUnit结合Mockito运行,自动初始化Mockito相关的注解和对象,简化测试代码。spy(new MyClass(...)):创建真实对象的Spy包装类,它会保留原对象的所有属性和方法逻辑,仅替换我们指定Mock的方法。doReturn("...").when(myClassSpy).getStringFromExternalSources():这种写法不会调用真实的getStringFromExternalSources方法,直接返回我们设定的值,完美避开外部资源依赖。如果用when(myClassSpy.getStringFromExternalSources()).thenReturn("..."),在Mockito 1.9.5里会先执行一次真实方法,这可能不是你想要的。
如果你的测试场景是某个方法依赖getStringFromExternalSources的返回值,只需要在测试前Mock好这个方法的返回值,就能轻松测试该方法的不同分支逻辑啦。
内容的提问来源于stack exchange,提问作者user993797
相关产品推荐
相关产品推荐

