模拟方法没有 return 预期值
Mocked method doesn't return expected value
我想使用 Mockito 测试我的 class 方法。
public class SplashPresenter {
public volatile State mField1 = State.DEFAULT;
public volatile State mField2 = State.DEFAULT;
boolean stateFlagsAreAllCompleted(@NonNull final ISplashView view) {
if (mField1 == State.COMPLETE //
&& mField2 == State.COMPLETE) {
// Check Forced Update
final int updateCheckResult = checkForcedUpdate(); // <===
if (updateCheckResult == MyConstants.PRODUCTION_UPDATE_AVAILABLE) {
view.displayForcedUpdateAlert(false);
return true;
}
if (updateCheckResult == MyConstants.BETA_UPDATE_AVAILABLE) {
view.displayForcedUpdateAlert(true);
return true;
}
view.restartLoader();
// Move to the home screen
return true;
}
return false;
}
int checkForcedUpdate() {
...... // my codes
}
}
这是我的测试class:
public class SplashPresenterTest_ForStateFlags {
private Context mContext;
private ISplashView mView;
@Before
public void setUp() throws Exception {
mContext = Mockito.mock(Context.class);
mView = Mockito.mock(ISplashView.class);
}
@Test
public void stateFlagsAreAllCompleted() throws Exception {
SplashPresenter presenter = Mockito.mock(SplashPresenter.class);
presenter.mField1 = State.COMPLETE;
presenter.mField2 = State.COMPLETE;
when(presenter.checkForcedUpdate()).thenReturn(1);
boolean actual = presenter.stateFlagsAreAllCompleted(mView);
System.out.println("actual: " + actual + ", " +
presenter.mField1 + ", " +
presenter.checkForcedUpdate());
assertTrue(actual);
}
}
测试失败是最后发生的事情。这是输出:
actual: false, COMPLETE, 1
我不明白的是,即使我将 stateFlagsAreAllCompleted
方法更改为以下代码,但仍然测试失败并显示上述输出。
boolean stateFlagsAreAllCompleted(@NonNull final ISplashView view) {
return true;
}
您还没有模拟方法 stateFlagsAreAllComplete
的行为。你需要做的:
when(presenter.stateFlagsAreAllComplete(Matchers.any()).thenReturn(true);
您可以将 Matchers.any() 参数微调为您想要的 class 类型。
编辑: 我看到您正在尝试测试方法 stateFlagsAreAllComplete
。由于您正在尝试测试 class SplashPresenter 的方法 stateFlagsAreAllComplete
,因此您不能通过模拟正在测试其方法的 class 来实现。您将不得不使用 class 的一个实例。模拟方法只应在测试时在另一个被测方法中调用时使用。
您必须创建要测试的 class 的实例。
我想使用 Mockito 测试我的 class 方法。
public class SplashPresenter {
public volatile State mField1 = State.DEFAULT;
public volatile State mField2 = State.DEFAULT;
boolean stateFlagsAreAllCompleted(@NonNull final ISplashView view) {
if (mField1 == State.COMPLETE //
&& mField2 == State.COMPLETE) {
// Check Forced Update
final int updateCheckResult = checkForcedUpdate(); // <===
if (updateCheckResult == MyConstants.PRODUCTION_UPDATE_AVAILABLE) {
view.displayForcedUpdateAlert(false);
return true;
}
if (updateCheckResult == MyConstants.BETA_UPDATE_AVAILABLE) {
view.displayForcedUpdateAlert(true);
return true;
}
view.restartLoader();
// Move to the home screen
return true;
}
return false;
}
int checkForcedUpdate() {
...... // my codes
}
}
这是我的测试class:
public class SplashPresenterTest_ForStateFlags {
private Context mContext;
private ISplashView mView;
@Before
public void setUp() throws Exception {
mContext = Mockito.mock(Context.class);
mView = Mockito.mock(ISplashView.class);
}
@Test
public void stateFlagsAreAllCompleted() throws Exception {
SplashPresenter presenter = Mockito.mock(SplashPresenter.class);
presenter.mField1 = State.COMPLETE;
presenter.mField2 = State.COMPLETE;
when(presenter.checkForcedUpdate()).thenReturn(1);
boolean actual = presenter.stateFlagsAreAllCompleted(mView);
System.out.println("actual: " + actual + ", " +
presenter.mField1 + ", " +
presenter.checkForcedUpdate());
assertTrue(actual);
}
}
测试失败是最后发生的事情。这是输出:
actual: false, COMPLETE, 1
我不明白的是,即使我将 stateFlagsAreAllCompleted
方法更改为以下代码,但仍然测试失败并显示上述输出。
boolean stateFlagsAreAllCompleted(@NonNull final ISplashView view) {
return true;
}
您还没有模拟方法 stateFlagsAreAllComplete
的行为。你需要做的:
when(presenter.stateFlagsAreAllComplete(Matchers.any()).thenReturn(true);
您可以将 Matchers.any() 参数微调为您想要的 class 类型。
编辑: 我看到您正在尝试测试方法 stateFlagsAreAllComplete
。由于您正在尝试测试 class SplashPresenter 的方法 stateFlagsAreAllComplete
,因此您不能通过模拟正在测试其方法的 class 来实现。您将不得不使用 class 的一个实例。模拟方法只应在测试时在另一个被测方法中调用时使用。
您必须创建要测试的 class 的实例。