gpt4 book ai didi

java - 使用 PowerMock 模拟单例的 getInstance

转载 作者:行者123 更新时间:2023-12-01 17:26:15 24 4
gpt4 key购买 nike

我有以下单例,它返回不同类的实例。我想模拟返回的实例对象上的方法。我一直在阅读有关最终类和单例的 PowerMock 模拟功能,但我不知道我的情况是否属于这些范围。我很欣赏一些建议。

public final class SomeWrapper {
private MyActualObject MyActualObject;
private static final SomeWrapper instance = new SomeWrapper();

private SomeWrapper() {
// singleton
}

public static SomeWrapper getInstance() {
return instance;
}

public void setMyActualObject(MyActualObject MyActualObject) {
if(this.MyActualObject == null) {
this.MyActualObject = MyActualObject;
} else {
throw new UnsupportedOperationException("MyActualObject is already set, cannot reset.");
}
}

public MyActualObject getMyActualObject() {
return MyActualObject;
}
}

现在在我的单元测试中,我想模拟以下行:

when(SomeWrapper.getInstance().getMyActualObject().isActive()).thenReturn(false);

我应该模拟 SomeWrapper 和 MyActualObject 吗?有代码示例作为指导吗?

最佳答案

使用这些 Mockito 和 PowerMock 版本:

testImplementation 'org.mockito:mockito-core:2.23.4'
testImplementation 'org.powermock:powermock-module-junit4:2.0.0-beta.5'
testImplementation 'org.powermock:powermock-api-mockito2:2.0.0-beta.5'

您可以使用 PowerMock.mockStatic()when() 机制模拟 Android MainApplication 单例实例(例如) ,像这样:

private MainApplication mApplication;

@NonNull
protected MainApplication getApplication() {
if (mApplication == null) {
mApplication = PowerMockito.mock(MainApplication.class);

PowerMockito.mockStatic(MainApplication.class);
PowerMockito.when(MainApplication.getInstance()).thenReturn(mApplication);
PowerMockito.when(mApplication.getBaseContext()).thenReturn(mApplication);
PowerMockito.when(mApplication.getApplicationContext()).thenReturn(mApplication);
}
return mApplication;
}

模拟私有(private)构造函数可能很棘手 - 您可以尝试本文中建议的方法,在 thenReturn() 调用中使用替代类: SO - Mocking Private Constructor

关于java - 使用 PowerMock 模拟单例的 getInstance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40616617/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com