2015-01-30 5 views
2

У меня проблема. Я хочу написать тест для кода, который опирается на выполнение метода PopupWindow.OnDismissListener.onDismiss(). Однако, похоже, это никогда не называется. Я делаю что-то неправильно? КодПочему PopupWindow.OnDismissListener не вызывается при использовании Robolectric?

Пример:

View content = new View(Robolectric.application); 
PopupWindow popup = new PopupWindow(content, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
popup.setOnDismissListener(new PopupWindow.OnDismissListener() { 
     @Override 
     public void onDismiss() { 
      Assert.fail(); 
     } 
}); 
View anchor = new View(Robolectric.application); 
popup.showAsDropDown(anchor); 
popup.dismiss(); 

выше тест никогда не подведет! Я попытался добавить небольшой сон после того, как возникли некоторые проблемы с синхронизацией. Я просмотрел сгенерированный код для PopupWindow.class, но ничего не нашел.

Спасибо!

+0

К сожалению, он ничего не поймал. Кроме того, не будут ли какие-либо исключения появляться при запуске кода? –

+0

Хмм кажется, что это проблема с диспетчером окон, вместо того чтобы называть непосредственно два последних оператора вызова anchor.post (r), где r - Runnable, который вызывает эти два оператора в методе run(), как привязка, так и всплывающее окно должны быть окончательными для этого – pskink

+0

это решило проблему? – pskink

ответ

0

Причина, по которой слушатель не называется потому, что ShadowPopupWindow из Robolectric переопределяет реализацию по умолчанию и просто не называют.

код из source:

public void dismiss() { 
    if (context != null) { 
     getWindowManager().removeView(containerView); 
    } 
    showing = false; 
    } 

В зависимости от того, что это вам нужно проверить, может быть допустимым обходным путем (ваш пример кода выше в значительной степени просто проверяет внутренность PopupWindow, которые я угадывание не то, что вы на самом деле хотите достичь). Вы также можете сделать свой собственный custom shadow, расширяя этот, где вы решите сделать другое поведение.

+0

отлично, спасибо! Вы правы, приведенный выше код - всего лишь образец, чтобы сделать его более понятным, что я имел в виду. –

0

Обычно я предпочитаю использовать диалоговые окна. Чтобы построить AlertDialog, использовать что-то вроде ниже на странице разработчиков:

/ 1. Instantiate an AlertDialog.Builder with its constructor 
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

// 2. Chain together various setter methods to set the dialog characteristics 
builder.setMessage(R.string.dialog_message) 
     .setTitle(R.string.dialog_title); 

// 3. Get the AlertDialog from create() 
AlertDialog dialog = builder.create(); 
+0

Спасибо за отзыв! Я не могу изменить тип, хотя, и мне нужно знать, если это ошибка, если есть обходной путь или если я делаю что-то неправильно ... –