0
votes

Le test d'unité de démarrage à ressort ne fonctionnera pas. Nullinsteadofmockexception

Je suis suivi de Javaworld's Junit 5 Guide pour écrire mes tests, mais les tests ne seront pas exécutés. L'exception est NullinsteadofmockeXception. Quelqu'un peut-il m'aider à comprendre ce que je fais mal? Le guide de Javaworld est à https://www.javaworld.com/article/3537563/junit-5-Torial-Part--Unit-testing-with-junit-5-mockito-and-hamcrest.html

Message d'erreur: P>

@Service
@Slf4j
public class ConferenceServiceImpl implements ConferenceService {

    private ConferenceRepository conferenceRepository;
    private ConferenceRoomRepository conferenceRoomRepository;

    public ConferenceServiceImpl(ConferenceRepository conferenceRepository, ConferenceRoomRepository conferenceRoomRepository) {
        this.conferenceRepository = conferenceRepository;
        this.conferenceRoomRepository = conferenceRoomRepository;
    }

    public String addConference(Conference conference) {

        throw new RuntimeException("Not yet implemented");
    }

    public String cancelConference(Conference conference) {

        throw new RuntimeException("Not yet implemented");
    }

    public String checkConferenceRoomAvailability(Conference conference) {

        throw new RuntimeException("Not yet implemented");
    }

    public Conference findConference(Conference conference) {
        return conferenceRepository.findConferenceByNameAndStartDateAndTimeAndEndDateAndTime(
                conference.getName(), conference.getStartDateAndTime(), conference.getEndDateAndTime());
    }

    public ConferenceRoom findConferenceRoom(ConferenceRoom conferenceRoom) {
        return conferenceRoomRepository.findConferenceRoomByNameAndAndLocation(
                conferenceRoom.getName(), conferenceRoom.getLocation());
    }

}


4 commentaires

Utilisez @InjectMocks au lieu de @autowired pour votre service.


Merci pour la suggestion. Malheureusement, je reçois toujours le même message d'erreur.


Peut-être que vous voulez montrer du code de la classe de service; Est-ce un @service et vous vous moquez de tous ses membres? Essayez également d'ajouter mockito.initmocks () dans un @BEforeArt méthode (bien que cela ne soit pas nécessaire avec l'extension).


J'ai ajouté le code de classe de service à mon message. La classe de service est marquée avec @service et tous les membres sont moqués. Intellij ne trouve pas de mockito.initmocks ().


4 Réponses :


0
votes

vous avez autonome ConferencesService Ce n'est donc pas une simule que vous pourriez ajuster dans son bravhior. Utilisez une mock ou un espion (masque partiel).

Parce que c'est aussi l'unité sous test, vous devez toujours injecter les autres moqueurs dans l'espion.

Essayez ceci: < pré> xxx

N'oubliez pas d'utiliser toujours l'espion et de ne pas appeler l'objet original non espacé lorsque vous essayez de configurer une simule partielle!

Notez également que de tels moqueurs partiels sont un indice pour une architecture non idéale et éventuellement indiquer des réponses mixtes. Donc, vous envisagez peut-être d'extraire les différentes méthodes à leur propre classe et de prendre une testabilité plus facile. N'oubliez pas non plus que les tests et le code en général sont beaucoup plus souvent lus que les simulacres écrits et partiels sont plus difficiles à comprendre en 6 mois lorsque vous essayez de déterminer ce que vous avez essayé de configurer comme cas de test.


4 commentaires

Merci pour la suggestion. Malheureusement, je reçois toujours le même message d'erreur.


J'ai montré plus de détails sur la configuration de la simulation partielle. Vérifiez-le :)


Merci pour la suggestion. Cela semble fonctionner. J'ai construit ma version à l'aide du guide à javaworld.com/article/3537563/... Cette approche semble plus pratique. Savez-vous pourquoi cela ne fonctionne pas pour moi?


Vous essayez de se moquer du comportement de l'unité sous test ( Findconference du service lui-même). Dans le guide, ils ne marchent que du comportement d'une unité différente (le référentiel au lieu du service). Pendant que le référentiel est une simule, le service n'est pas. Si vous voulez seulement se moquer partiellement d'une unité (par exemple, le service dans votre cas doit être moqué pour Findconference mais pas pour Addconference ) Vous devez utiliser une simule partielle.



2
votes

au lieu de

@InjectMocks
ConferenceServiceImpl conferenceService;


1 commentaires

Merci pour la suggestion. Malheureusement, je reçois toujours le même message d'erreur.



2
votes

Vous mélangez ici de nombreux concepts:

  1. Utilisez @autowire uniquement dans l'écosystème de printemps (code réel ou tester au printemps). Ici, vous n'avez pas de printemps dans le test, ne l'utilisez pas.

  2. dans un test d'unité régulière, vous feriez mieux de créer le sujet (classe que vous êtes sur le point de tester) par vous-même. xxx

    imo Assurez-vous que cette configuration fonctionne pour vous avant d'apprendre des trucs avancés comme @InjectMocks


0 commentaires

0
votes

La réponse de Stack semble être la solution. "Vous essayez de se moquer de comportement de l'unité à tester (conférence du service lui-même). Dans le guide, ils ne font que se moquer de comportement d'une unité différente (le référentiel au lieu du service). Alors que le référentiel est une simule, le service n'est pas . "

Le code est exécuté si j'utilise xxx

et xxx


0 commentaires