2015-04-28 4 views
0

Я хочу протестировать свою игру, написанную на slick2d (которая построена на LWJGL), с помощью теста Junit. (Может быть, это плохая идея выполнить модульный тест, но я выбрал его как домашнюю работу .) Я запускаю игру в отдельном потоке и имитирую клик мышью и делаю тесты. Это хорошо, пока у меня не будет более одной тестовой функции. (Я скопировал и вставил функцию «тест» во вторую функцию). Создание другого игрового контейнера и фактической игры во второй тестовой функции приводит к сбою моего теста. Думаю, мне нужно как-то сбросить контекст игры после тестов, но я понятия не имею, как это сделать.Испытание Slick unit - ошибка при повторном запуске игры

Вот мой тест: (я упростил его как можно больше)

@Test 
public void test() throws InterruptedException { 

    Thread t = new Thread(new engineTest()); 
    t.start(); 

    Thread.sleep(3000); // wait for game to initialize 

    // Game simulation and asserts are here 

    t.interrupt(); 

    Thread.sleep(1000); 
} 

Я пробовал много вариантов, включая вызов .exit() и .destroy() к игре контейнеру, но он снова упал.

А функция нить здесь:

public class engineTest implements Runnable { 

    @Override 
    public void run() { 
     SapiensSlick.main(null); // SapiensSlick is name of the game 
    } 
} 

И я получаю эту ошибку, когда вторая функция выполняется:

[xcb] Unknown request in queue while dequeuing 
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called 
[xcb] Aborting, sorry about that. 
java: ../../src/xcb_io.c:179: dequeue_pending_request: Předpoklad „!xcb_xlib_unknown_req_in_deq“ nesplněn. 
hello 
Tue Apr 28 10:50:07 CEST 2015 INFO:Slick Build #237 
Testsuite: JunitTest 
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0 sec 

Testcase: JunitTest:test: Caused an ERROR 
Forked Java VM exited abnormally. Please note the time in the report does not reflect the time until the VM exit. 
junit.framework.AssertionFailedError: Forked Java VM exited abnormally. Please note the time in the report does not reflect the time until the VM exit. 
    at org.netbeans.core.execution.RunClassThread.run(RunClassThread.java:153) 
+0

Я не нашел решение, поэтому я в конечном итоге побежал в одной теме и проверил в другом. –

ответ

0

Вы должны убедиться, что «engineTest.run» завершается , Например, вы можете ввести логический флаг «завершать» в игру. Затем «SapiensSlick» периодически проверяет этот логический флаг и завершает себя, когда он является истинным. Ваш тестовый пример может установить этот флаг в значение «true» и дождаться окончания отчета о завершении игры. Как именно вы могли бы реализовать это, зависит от вашей библиотеки (не знаю Slick).

Importand point: не заставляйте нить кончать снаружи, он должен закончить себя!

Смежные вопросы