Łatwo jest zweryfikować, że konkretna interakcja (określone wywołanie metody) wystąpiło na próbnym obiekcie w Mockito, i istnieje verifyZeroInteractions()
dla sprawdzenia, że żadne interakcje w ogóle nie wystąpiły. Załóżmy, że testuję interfejs taki jak rejestrator, z takimi metodami, jak info()
, warn()
, error()
itd. W konkretnym scenariuszu wiem, że jedna z tych metod powinna zostać wywołana, ale tak naprawdę nie obchodzi mnie, który z nich. Czy istnieje zwarty sposób sprawdzenia, czy jakakolwiek interakcja z próbnym obiektem wystąpiła bez potrzeby określenia, która metoda powinna zostać wywołana? A może taki mechanizm nie jest konieczny, ponieważ "sposób Mockito" testowania tego byłby inny od tego, co sobie wyobrażam?Czy możliwe jest sprawdzenie arbitralnej interakcji za pomocą Mockito w zwarty sposób?
Odpowiedz
Jeśli możesz zlecić zewnętrznemu utworzeniu obiektu rejestratora z testowanej klasy, nie ma powodu, dla którego nie możesz napisać własnej implementacji testowej interfejsu dziennika, która będzie rejestrować, które metody zostały wykonane i wstrzyknąć je jako część twoja konfiguracja testu.
Próbne biblioteki robią wiele dobrego, ale czasami są takie przypadki, jak te, które można znaleźć tam, gdzie mogą nie pokrywać twoich potrzeb.
Jeśli piszesz własną implementację do testowania tak i wstrzyknąć go do yourt klasie testu badanego, to można stwierdzić na getCount() > 0
public class LoggerTestSupportImpl implements ILogger {
private int count = 0;
@Override
public int getCount() {
return count;
}
@Override
public void info(String message) {
count++;
}
@Override
public void warn(String message) {
count++;
}
}
Z log4j, aby przetestować rejestrator robię następującą konfigurację:
@Mock private Appender log4jAppender;
private Logger logger;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
Logger root = Logger.getRootLogger();
if (!root.getAllAppenders().hasMoreElements()) {
// No appenders means log4j is not initialized!
BasicConfigurator.configure();
}
logger = Logger.getLogger(MyClassWhichLogs.class);
logger.addAppender(log4jAppender);
}
a następnie w moim teście I wykonaj następujące czynności:
verifyZeroInteractions(log4jAppender);
lub
verify(log4jAppender).doAppend(any(LoggingEvent.class);
Jeśli musisz przetestować zarejestrowane wartości, możesz zamiast tego podać kontrolującego:
ArgumentCaptor<LoggingEvent> logCaptor = ArgumentCaptor.forClass(LoggingEvent.class);
verify(log4jAppender).doAppend(logCaptor.capture());
assertTrue(logCaptor.getValue().contains("my text to match");
Chociaż nie musi to być odpowiedź na ogólne pytanie (nie sądzę, że to, czego szukasz), może rozwiązać ten konkretny problem podczas testowania rejestrowania.
- 1. Czy jest możliwe sprawdzenie pojedynczego obiektu węzła?
- 2. Czy możliwe jest sprawdzenie, czy Handler rozpoznał, że został usunięty?
- 3. Czy jest możliwe sprawdzenie atrybutu xmlns: fb (Facebook)?
- 4. Mockito weryfikacji nie więcej interakcji pominięciem getters
- 5. Czy możliwe jest sprawdzenie zwycięskiego stanu gry TicTacToe za pomocą jGraphT?
- 6. Szyny: możliwe sprawdzenie, czy ciąg znaków jest binarny?
- 7. Czy możliwe jest getMethods w porządku za pomocą odbić?
- 8. Najlepszy sposób na sprawdzenie nagłówków odpowiedzi HTTP za pomocą Selenium
- 9. Najlepszy sposób na sprawdzenie, czy JQuery jest dostępny?
- 10. Jaki jest najszybszy sposób na sprawdzenie, czy obiekt jest IEnumerable?
- 11. Czy możliwe jest udokumentowanie obiektu javascript za pomocą ESDOC?
- 12. Sprawdzenie czy DateTime jest przed DateTime.Now
- 13. Sprawdzenie, czy proces php jest już uruchomiony
- 14. Czy możliwe jest wyczyszczenie całkowicie pozycjonowanych elementów za pomocą CSS?
- 15. Czy możliwe jest formatowanie kodu C++ za pomocą VIM?
- 16. Czy jest możliwe aby wysłać zawartość vim za pomocą HTML
- 17. Czy odwzorowanie macierzy 3x3 jest możliwe za pomocą instrukcji SIMD?
- 18. Czy jest możliwe za pomocą Resharpera, aby usunąć inicjalizator obiektu?
- 19. sprawdzenie, czy klasa jest java.lang.Enum
- 20. Czy możliwe jest parowanie mark i space za pomocą boost.asio?
- 21. Emacs Lisp: dopasowanie powtarzającego się wzoru w zwarty sposób?
- 22. Czy możliwe jest drukowanie osi czasu za pomocą matplotlib?
- 23. Jaki jest szybki sposób na sprawdzenie, czy plik istnieje?
- 24. Najlepszy sposób na sprawdzenie, czy plik jest pusty (php)?
- 25. Najlepszy sposób na sprawdzenie, czy zmienna jest zerowa?
- 26. Jaki jest najlepszy sposób na sprawdzenie zawartości za pomocą programu Code Igniter?
- 27. Czy istnieje sposób określenia ogólnej funkcji kosztu arbitralnej metody java?
- 28. Czy konieczne jest sprawdzenie zwracanej wartości wysyłania w 0MQ za pomocą C++?
- 29. Jak kpić z kontekstu za pomocą Mockito?
- 30. sprawdzenie, czy wartości w liście jest częścią String
To jest dokładnie tak, jak ja testuje moją klasę tak daleko, Zastanawiałem się tylko, czy Mockito nie może oszczędzić mi pisania trywialnych implementacji dla wszystkich metod. –
Powiedziałbym, że robisz rozsądną rzecz Michała. Mockito nie obsługuje tego rodzaju testów. Twoim jedynym wyborem jest zejście z trasy 'ArgumentCaptor', o której wspomniał Kevin, ale to prowadzi do wielu" szumów "w twoich testowych klasach. – Brad
Zgadzam się, że jest trochę hałaśliwy, ale większość szumu jest zlokalizowana na deklaracje i metodę Before, a nawet można dodać Captora do deklaracji poziomu klasy, jeśli ma być używana w wielu metodach testowych (nawet nie jest wymagana, jeśli nie ma dostępu do msg) . Zaletą korzystania z Mockito jest to, że masz już dostęp do pełnego API rejestrowania. Aby to zrobić w swoim przykładzie, musisz rozszerzyć możliwości ręcznie zwijanej makiety (przechwycić/pobrać dowolne # z zalogowanych wiadomości itp.). Jednak w przypadku prostych potrzeb Twój sposób wydaje się prostszy, czystszy, * i * możliwy do ponownego użycia, więc są one kilka plusów dla twojego podejścia. –