繁体   English   中英

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

[英]Pass real object and mock object in constructor

我有一个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 不为 null,则 constantMapService 为 null,反之亦然。

模拟测试类:

@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和类似的自动连接必须在类实例化后发生,如果您需要在初始化期间引用模拟,请以编程方式创建它:

AccountDetailsRestClient mockRestClient = mock(AccountDetailsRestClient.class);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM