我有以下测试用例我写过但如果这是一个很好的测试我有点困惑。因为我可以告诉我,当我用userDataMock模拟时,我正在改变真正的结果。所以我真的已经将最终结果改为“预期”。因此,当我进行真正的测试时,唯一的结果就是“预期”,因为我已经用Mockito.when(userDataMock.doStandardLogin(loginInfoMock)).thenReturn(expected);
嘲笑它了
我以前见过开发人员这样做,但我想要一个真正的测试。我做错了什么或者没有想到什么?
public class DoStandardLoginUsecaseTest {
private DoStandardLoginUsecase target;
private MyApplication contextMock;
@Before
public void beforeEach() {
contextMock = Mockito.mock(MyApplication.class);
// Note that you need to mock the getPresenterComponent
// but I don't know what it returns.
target = new DoStandardLoginUsecase(contextMock);
}
@Test
public void buildUseCaseObservable() {
UserDataRepository userDataMock = Mockito.mock(UserDataRepository.class);
StandardLoginInfo loginInfoMock = Mockito.mock(StandardLoginInfo.class);
target.mUserDataRepo = userDataMock;
target.setLoginInfo(loginInfoMock);
Observable<Login> expected = // create your expected test data however you like...
Mockito.when(userDataMock.doStandardLogin(loginInfoMock)).thenReturn(expected);
Observable<Login> actual = target.buildUseCaseObservable();
Assert.areSame(actual, expected);
}
}
更新:这是我定位测试的实际课程:
DoStandardLoginUsecase.java:
public class DoStandardLoginUsecase extends BaseUseCase {
@Inject
UserDataRepository mUserDataRepo;
private StandardLoginInfo loginInfo;
@Inject
public DoStandardLoginUsecase(UserDataRepository userDataRepository) {
mUserDataRepo = userDataRepository;
}
@Override
public Observable<Login> buildUseCaseObservable() {
return mUserDataRepo.doStandardLogin(loginInfo);
}
public void setLoginInfo(StandardLoginInfo loginInfo) {
this.loginInfo = loginInfo;
}
}
答案 0 :(得分:1)
这是一个非常健康的想法,这是真的 - 当你嘲笑一切时,你最终会测试你的测试。不幸的是,今天嘲笑是一种非常普遍的做法,大多被滥用。你可以编写不同类型的测试,而不是嘲笑:
这称为Test Pyramid。但有时你还是想嘲笑。这通常发生在系统的边界上。例如。您从外部站点获取一些数据并分析结果。要检查解析,您确实不需要连接到外部站点 - 您可以模拟获取数据的部分。这使您可以编写非常快速和简单的测试。