Модульное тестирование с помощью TestFX (и Mockito)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Модульное тестирование с помощью TestFX (и Mockito)

Сообщение Anonymous »

Насколько я понимаю, вам необходимо @ExtendWith(MockitoExtension.class) для запуска тестового класса с помощью Mockito runner. А чтобы использовать TestFX для тестирования приложения JavaFX, вам понадобится @ExtendWith(ApplicationExtension.class). Мой вопрос: как сделать и то, и другое одновременно?
Где я могу найти хорошие примеры/руководства по модульным тестам для приложения JavaFX с архитектурой MVC? Да, я гуглил, но примеры простые...
В приложении весенней загрузки, которое я тестирую, мой тестовый класс имеет фиктивные объекты (с использованием @InjectMocks и @Mock).

Код: Выделить всё

@ExtendWith(MockitoExtension.class)
class BurgerControllerTest extends FXTest {
@InjectMocks
BurgerController burgerController;

@Mock
BurgerUtils burgerUtils;

@Mock
ApplicationEventPublisher publisher;

//This is for spring, so I can pick up events published
@Autowired
ApplicationEvents applicationEvents;

@Test
void testSomething(){
burgerController.onBurgerSaveEvent(int x);
assertEquals(1, applicationEvents.stream(LocalFileSaveRequestEvent.class)).count(),"There was a save file event!");
}
Класс FXTest просто выполняет Platform.startup, он не запускает приложение со стадией или чем-то еще.
Я хочу протестировать метод onBurgerSaveEvent, но он вызывает «ApplicationStartupTask.getPrimaryStage()», который выглядит следующим образом

Код: Выделить всё

public class ApplicationStartupTask extends Task {
ApplicationStartupTask(Stage primaryStage, Application application) {
stage = primaryStage;
this.application = application;
}
}

Код: Выделить всё

class BurgerController{
@Autowired
private burgerUtils;
@Autowired
private ApplicationEventPublisher publisher;

onBurgerSaveEvent(int x){
File file = LocalFileManager.chooseWriteFile(ApplicationStartupTask.getPrimaryStage());
publisher.publishEvent(new LocalFileSaveRequestEvent(this, file, x));
}
}
Он вызывает другой класс LocalFileManager, в котором есть элементы JavaFX.

Код: Выделить всё

class LocalFileManager{
public static File chooseWriteFile(Stage stage) {
//Adds a stage to the existing javafx application
Stage dummy = new Stage();
dummy.initOwner(stage);
FileChooser fileChooser = new FileChooser();
File selected = fileChooser.showSaveDialog(dummy);
.....
}
}
Проблема в том, что мой тест не запускается, он жалуется, что его нет в потоке JavaFX. он находится в основном потоке, как только BurgerController.onBurgerSaveEvent достигает строки LocalFileManager.chooseWriteFile. Даже если я использую Platform.runLater, это не работает.
Чтобы запустить все в одном потоке, я предполагаю, что мне нужно расширить ApplicationTest или запустить с ApplicationExtension.class и создать метод start/@Start, который устанавливает сцену и stage.show()
Но если я это сделаю, я не смогу работать с MockitoExtension.class, и он скажет, что все мои макеты имеют значение null.

Подробнее здесь: https://stackoverflow.com/questions/797 ... nd-mockito
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»