在构造函数中传递真实对象和模拟对象



我有一个AccountDetails构造函数,如下所示。

private final AccountDetailsRestClient accountDetailsRestClient;
private final ConstantMapService constantMapService; 
private CalculationMap calculationMap;
public AccountDetails(final AccountDetailsRestClient accountDetailsRestClient, final ConstantMapService constantMapService) {
this.accountDetailsRestClient = accountDetailsRestClient;
this.constantMapService = constantMapService;
initializeConstantsData();
}
private void initializeConstantsData() {
if (this.calculationMap == null) {
this.calculationMap = constantMapService.getMap(java.time.LocalDate.now());
}
}

使用Mockito我无法初始化所有3个对象accountDetailsRestClient, constantMapService, calculationMap。如果accountDetailsRestClient不为空,则constantMapService为空,反之亦然。

Mockito测试类:

@RunWith(MockitoJUnitRunner.class)
public class AccountDetailsTest {

@Mock
private AccountDetailsRestClient accountDetailsRestClient;

@Mock(answer = RETURNS_DEEP_STUBS)
private CalculationMap calculationMap;

@InjectMocks
private final AccountDetails sut = new AccountDetailsTestImpl(new ConstantMapServiceMock());
@Test
public void testMethod() {
//left it blank to check constructor issue first
}

class AccountDetailsTestImpl extends AccountDetails {
AccountDetailsTestImpl(final ConstantMapService constantMapService) {
super(accountDetailsRestClient, constantMapService);
}
}

}

但是accountDetailsRestClient在构造函数中现在是空的。

不使用PowerMock如何解决此问题?要么通过更改类中的代码,要么通过更改模拟测试类?

不要使用@InjectMocks,简单地手工做事情,就像你几乎已经在做一样:

AccountDetails sut = new AccountDetails(mockDependency, realObject);

由于@Mock和类似的自动连接必须在类实例化之后发生,如果您需要在初始化期间引用mock,请以编程方式创建它:

AccountDetailsRestClient mockRestClient = mock(AccountDetailsRestClient.class);