junit - 如何进行真正的测试而不是嘲笑(改变结果)

时间:2017-06-11 16:50:42

标签: java unit-testing junit

我有以下测试用例我写过但如果这是一个很好的测试我有点困惑。因为我可以告诉我,当我用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;
}

}

1 个答案:

答案 0 :(得分:1)

这是一个非常健康的想法,这是真的 - 当你嘲笑一切时,你最终会测试你的测试。不幸的是,今天嘲笑是一种非常普遍的做法,大多被滥用。你可以编写不同类型的测试,而不是嘲笑:

  • 单元测试会单独检查类。为了实现这一目标,你可以不用嘲笑,尤其需要遵循旧的OOP和丰富的模型。
  • 组件(a.k.a.集成)测试 - 这些可以初始化您的应用程序的一部分并检查类的集群。例如,您可以使用内存数据库初始化spring上下文。
  • 系统测试针对完全部署的应用程序运行。如果是UI,这些可能是Selenium测试。如果这是一个REST API,那么这些可能是RestAssured测试。

这称为Test Pyramid。但有时你还是想嘲笑。这通常发生在系统的边界上。例如。您从外部站点获取一些数据并分析结果。要检查解析,您确实不需要连接到外部站点 - 您可以模拟获取数据的部分。这使您可以编写非常快速和简单的测试。