【问题标题】:Unit test android: How to return function not to be null when calls another function return and use单元测试android:调用另一个函数返回和使用时如何返回函数不为null
【发布时间】:2019-09-18 08:08:24
【问题描述】:

我有一个 FileRepository 类来填充 MutableLiveData。我在那里有两个功能。一是调用网络服务和设置列表(getAllFilms)。另一个是分配MutableLiveData 与第一个函数列表(getFilmData)。我尝试为MutableLiveDataunit test。你能帮助我吗?此函数数据始终为空。

public class FilmRepositoryTest

@Mock
FilmRepository frepo;

@Rule
public InstantTaskExecutorRule instantTaskExecutorRule = new InstantTaskExecutorRule();


@Before
public void setUp() throws Exception {
}

@Test
public void getFilmData_forData() throws IOException {
    ArrayList<film> filmlistesi = new ArrayList<>();
    MutableLiveData<List<film>> bilgi = new MutableLiveData<>();
    String arama = "ankara";
    filmlistesi.add(new film("Behzat Ç.: Bir Ankara Polisiyesi","2010–2019","tt1795096","series","https://m.media-amazon.com/images/M/MV5BZDZjY2I5ZjEtZGE2MS00ZjRmLTlmMGEtMDQ5ZmZhZWJjYzk3XkEyXkFqcGdeQXVyNDg4MjkzNDk@._V1_SX300.jpg"));

    when(frepo.getAllFilms(arama)).thenReturn(filmlistesi);
    bilgi.setValue(filmlistesi);
    System.out.println(frepo.getFilmData(arama)); // print(NULL)
    System.out.println(bilgi.getValue());         // print(filmlistesi)
    assertEquals(frepo.getFilmData(arama),bilgi.getValue());

}

public class FilmRepository

public MutableLiveData<List<film>> getFilmData(String a) throws IOException {
    MutableLiveData<List<film>> data = new MutableLiveData<>();
    data.setValue(getAllFilms(a));
    return data;
}

public ArrayList getAllFilms(String filmName) throws IOException {
    ArrayList<film> dataset = new ArrayList<>();
    return dataset;
}

【问题讨论】:

  • 与内部模拟方法没有关系。看this link

标签: java android unit-testing mockito junit5


【解决方案1】:

LiveData 或 MutableLiveData 必须有一个 Observer 集合,否则返回 null

Observer<List<film>> observer = new Observer<List<film>>() {

        @Override
        public void onChanged(@Nullable List<film> films) {
            assertEquals(frepo.getFilmData(arama), films.getValue());
            biligi.removeObserver(this)
        }

};

bilgi.observeForever(observer);
bilgi.setValue(filmlistesi);

【讨论】:

  • 是的,我在 MainActivity 类中有一个观察者。当我编写单元测试时,它为空。通常,它正在工作。另一个问题是我在哪里可以使用 getAllFilms 函数。您的代码不是使用它,而是 getFilmData 从 getAllFilms 函数获取列表
  • 您已将@Rule 设置为 InstantTaskExecutorRule 而不是 ActivtiyTestRule,因此在您运行测试时 MainActivity 不会运行,因此无论您是否在 MainActivity 中设置了观察者或不是。其次,关于 getAllFilms 函数,您没有对传递的参数做任何事情,只是返回一个空的 ArrayList。在哪里调用方法取决于你的实现逻辑
  • 因为混乱,我删掉了我的代码。 getAllFilms 函数 -> 从 api 获取数据并写入领域数据库。然后,返回列表。我需要用它来测试
  • 如果您从 API 获取数据,那么无法使用 InstantTestExecutorRule 进行测试,您必须使用 ActivityTestRule 并在设备上运行它,还必须在您的当从 API 获取数据时通知您的存储库
猜你喜欢
  • 2017-01-03
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
相关资源
最近更新 更多