如何在 JUnit 中模拟本地对象创建

How to mock local object creations in JUnit

我不知道如何使用 JUnit 和 mockito 在方法中模拟本地对象。

JDK - 1.7,JUnit - 4.12,powermock-module-junit4 - 1.6.6,powermock-api-mockito - 1.6.6

还有一点,我必须只使用JDK 1.7.

在下面的示例 class 中,如何在方法范围内模拟 "service" 对象。

class A {
public String methodA() {

SampleService service = new SampleService();
return service.retrieveValue();

}
}

请推荐。

你不知道。您修复该方法,以便 SampleService 作为方法参数或作为 A 的构造函数的一部分注入。

您不能模拟局部变量。但您可以执行以下操作:

1) 创建工厂并注入测试 class。重构之后,您可以模拟工厂并为测试对象提供模拟服务。

class A {
    private SampleServiceFactory factory;
    public String methodA() {
        SampleService service = factory.createSampleService();
        return service.retrieveValue();
    }
}

在测试中,您应该注入工厂模拟,然后 return 在 createSampleService() 调用上模拟服务:

when(mockFactory.retrieveValue()).thenReturn(mockService);

2) 您可以提取方法并在测试中覆盖它,return 模拟而不是实现:

class A {
    public String methodA() {
        SampleService service = createSampleService();
        return service.retrieveValue();
    }

   protected SampleService createSampleService() {
     return new SampleService();
   }
}

在这种方法中,您可以执行以下操作: @测试

public void testServiceCall() {
   A testedObject = new A() {
       @Override
       protected SampleService createSampleService() {
         return mockSampleService;
       }
   }
   ...
   testedObject.methodA();
   ...
   verify(service).retrieveValue();
}

PS:我更喜欢第一个,我认为更改访问修饰符不是最好的方法。