Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Testy jednostkowe MessageBoardService #1

Open
kkojot opened this issue Oct 26, 2018 · 3 comments
Open

Testy jednostkowe MessageBoardService #1

kkojot opened this issue Oct 26, 2018 · 3 comments

Comments

@kkojot
Copy link

kkojot commented Oct 26, 2018

Cześć,

Po ukończeniu kursu chciałem dodać unit testy klasy MessageBoardService, np. sprawdzające, czy istnieją zdefiniowane topici:

class MessageBoardServiceTest {

    @Test
    public void messageBoardShouldHaveAllPredefinedTopics() {
        MessageBoardService service = new MessageBoardService();

        assertTrue(doesTopicExist(service, "test"));
        assertTrue(doesTopicExist(service, "general"));
        assertTrue(doesTopicExist(service, "java"));
    }

    @Test
    public void messageBoardShouldNotHaveUndefinedTopics() {
        MessageBoardService service = new MessageBoardService();

        assertFalse(doesTopicExist(service, "undefined"));
        assertFalse(doesTopicExist(service, ""));
    }

    private boolean doesTopicExist(MessageBoardService service, String topicName) {
        Option<Topic> topic = service.getTopic(topicName);
        return !topic.isEmpty();
    }

}

Niestety, testowanie tej klasy jest uciążliwe, bo musimy poczekać aż cały kontekst Springa wystartuje, a to trwa bardzo długo w porównaniu do testów w czystej Javie. Do tego próby testów metody addMessageToTopic(String topicName, Message newMsg) kończą się trwałym zapisem zmian w bazie danych. Rozwiązania jakie mi przychodzą do głowy:

  1. Mockowanie - słabe, bo testy będą się nadal długo wykonywać, co wraz z rozrostem projektu doprowadzi do zaniechania pisania testów w ogóle
  2. Wydzielenie metoda init() ładującą kontekst Springa - głupie, komplikowanie kodu tylko ze względu na testy
  3. Nie pisanie testów takich klas w ogóle ;)

@jarekratajski co polecisz?

@jarekratajski
Copy link
Contributor

jarekratajski commented Oct 26, 2018 via email

@jarekratajski
Copy link
Contributor

jarekratajski commented Nov 4, 2018 via email

@kkojot
Copy link
Author

kkojot commented Nov 5, 2018

Dzięki za odpwiedź ;)

Wpis w application.properties: spring.data.mongodb.database=myRealDb działa mi prawidłowo w typowej springowej aplikacji, niestety przy startowaniu Springa w sposób przedstawiony w kursie propertiesy są ignorowane, wiesz jak temu zaradzić?

Podsumowując:

  • wydzielam kod ładujący kontekst Springa z konstruktora klasy MessageBoardService do innej klasy, która zwróci mi mongoRepository typu CrudRepository<BoardMessage, Long>
  • dodaję w niej konstruktor MessageBoardService(CrudRepository<BoardMessage, Long> mongoRepository) {
  • piszę klasę MessageBoardDataProvider implements CrudRepository<BoardMessage, Long>
  • implementuję w niej odpowiednio metody save, findAll itp. i ewentualnie dodaję wewnątrz HashMapę
  • testując logikę w klasie MessageBoardService używam MessageBoardDataProvider jako parametr konstruktora
  • w MessageBoardApplication za to przekazuję MongoRespository, tutaj też startuję kontekst Springa

Jest trochę klepania, ale podoba mi się. W ten sposób mogę testować logikę przy użyciu szybkich unit testów i nie babrać się ze Springiem.
Poza logiką można dołożyć do tego testy na bazie, żeby sprawdzić czy obiekty się odpowiednio serializują (bo np. ZonedDateTime zapisuje się w jakiejś dziwnej postaci).

Pozdrawiam,
Wojtek.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants