5 java android constructor unit-testing mocking
我正在尝试在方法内部模拟对象创建。我有LoginFragment哪个是LoginPresenterImpl在onCreate方法内部创建的,如下所示:
public class LoginFragment extends BaseFragment {
private LoginPresenter mPresenter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPresenter = new LoginPresenterImpl(this); <<-- Should be mocked
}
}
Run Code Online (Sandbox Code Playgroud)
我在组合RobolectricGradleTestRunner和PowerMockRunner在一个测试中遇到了一些问题,但在阅读了这篇文章后,我找到了如何做到这一点的方法,所以我的测试如下所示:
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"})
public abstract class BaseRobolectricTest {
}
Run Code Online (Sandbox Code Playgroud)
@PrepareForTest({LoginPresenterImpl.class})
public class Test extends BaseRobolectricTest {
private LoginPresenterImpl mPresenterMock;
@Rule
public PowerMockRule rule = new PowerMockRule();
@Before
public void setup() {
mockStatic(LoginPresenterImpl.class);
mPresenterMock = PowerMockito.mock(LoginPresenterImpl.class);
}
@Test
public void testing() throws Exception {
when(mPresenterMock.loadUsername(any(Context.class))).thenReturn(VALID_USERNAME);
when(mPresenterMock.loadPassword(any(Context.class))).thenReturn(VALID_PASSWORD);
when(mPresenterMock.canAutologin(VALID_USERNAME, VALID_PASSWORD)).thenReturn(true);
whenNew(LoginPresenterImpl.class).withAnyArguments().thenReturn(mPresenterMock);
FragmentTestUtil.startFragment(createLoginFragment());
}
private LoginFragment createLoginFragment() {
LoginFragment loginFragment = LoginFragment.newInstance();
return loginFragment;
}
}
Run Code Online (Sandbox Code Playgroud)
这只是一个糟糕的代码,与“依赖注入”模式相反。
如果您使用像这样的依赖注入框架Dagger,则不会发生这样的问题,因为所有使用的类都会被注入。
在测试用例中,您将重写模块以提供模拟而不是真实的类:
@Module
public class TestDataModule extends DataModule {
public TestDataModule(Application application) {
super(application);
}
@Override
public DatabaseManager provideDatabaseManager(DatabaseUtil databaseUtil) {
return mock(DatabaseManager.class);
}
}
Run Code Online (Sandbox Code Playgroud)
并嘲笑他们的行为。
SOLID 规则对于维护可测试和可重用的代码非常重要。
| 归档时间: |
|
| 查看次数: |
11534 次 |
| 最近记录: |