如何在 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:我更喜欢第一个,我认为更改访问修饰符不是最好的方法。
我不知道如何使用 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:我更喜欢第一个,我认为更改访问修饰符不是最好的方法。