如何使用Mockito模拟类的静态成员变量?

7ajki6be  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(829)

我有这样一个类:

public class CloudFormationManager
{
    private static CloudFormationManager cloudFormationManager;
    private final AmazonCloudFormation amazonCloudFormation;

    private CloudFormationManager(final AmazonCloudFormation amazonCloudFormation)
    {
        this.amazonCloudFormation = amazonCloudFormation;
    }

    public List<StackResource> getStackResources(final String stackName)
    {
        ListStackResourcesRequest listStackResourcesRequest = new ListStackResourcesRequest();
        listStackResourcesRequest.setStackName(stackName);
        ListStackResourcesResult listStackResourcesResult =
                amazonCloudFormation.listStackResources(listStackResourcesRequest);

        if (nonNull(listStackResourcesResult))
            return getStackResources(listStackResourcesResult);
        else
            return Collections.emptyList();
    }
}

我开始使用Mockito编写UT,如下所示:

@Test
public class CloudFormationManagerTest
{
    @Mock
    private AmazonCloudFormation amazonCloudFormation;

    @InjectMocks
    CloudFormationManager cloudFormationManager;

    @BeforeMethod
    public void setUp() throws IOException
    {
        CloudFormationManager cloudFormationManager = new CloudFormationManager(amazonCloudFormation); // this statement gives an error.
        MockitoAnnotations.initMocks(this);
    }

    @Test
    void testGetStackResources()
    {

    }

}

现在,在setUp()方法中,我看到一个错误,说这个类不能被初始化,我理解这一点,因为它是一个私有构造函数?那么我该如何使用Mockito初始化它?

ymdaylpp

ymdaylpp1#

您似乎不清楚@Mock@InjectMocks的功能。
使用@Mock,你创建了一个 mocked 对象。使用@InjectMocks,你让Mockito insert 所有@Mock对象到某个测试对象中。
您的类CloudFormationManager两个字段。因此,您 * 可能 * 需要:

@Mock
private AmazonCloudFormation mockedAmazonCloud;

@Mock
CloudFormationManager mockedFormationManager;

@InjectMocks
CloudFormationManager cloudFormationManager;

现在Mockito应该在调用initAnnotiations()时设置这两个字段。
有关详细信息,请参阅here

相关问题