JUnit 测试失败并出现错误 "Wanted but not invoked" - 如何修复损坏的 Unittest?

JUnit Test fails with error "Wanted but not invoked" - how to fix broken Unittest?

我有一个 Java class 想要测试;它应该在视图中显示直接付款授权书:

package com.xxx.provider;

import static xxx.Constants.DATE_FORMATTER;

import com.xxx.business.druck.DruckDaten;
import com.xxx.business.druck.DruckKategorie;
import com.xxx.business.druck.DruckParameter;
import com.xxx.services.model.Angebot;
import com.xxx.services.model.Beitragszahler;
import com.xxx.services.model.Inkassodaten;
import com.xxx.services.model.partner.NatuerlichePerson;
import com.xxx.services.model.partner.Partner;
import com.xxx.services.model.partner.PartnerTyp;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class DruckDatenProviderSepaMandat extends AbstractAngebotAntragDruckdatenProvider {

  private static final String SEPAMANDAT_FO = "sepamandat_konsolidiert.fo";

  private final AntragsnummerDruckdatenProvider antragsnummerDruckdatenProvider;

  public DruckDaten provideDruckdaten(
      Angebot angebot,
      Partner partner,
      Beitragszahler beitragszahler,
      NatuerlichePerson natuerlichePerson) {
    DruckDaten druckDaten = new DruckDaten();
    Map<String, Serializable> parameters = new HashMap<>();

    addBeitragszahler(parameters, angebot);
    Inkassodaten inkassodaten = beitragszahler.getInkassodaten();
    putAllgemeineDaten(parameters);

    mapWithFormatted(parameters, "anwendung", "ExpertOnline");
    mapWithFormatted(parameters, "antragsnummer", "xxx");
    mapWithFormatted(parameters, "antragseinreichungsArt", "xxx");
    mapWithFormatted(parameters, "antragsDatum", DATE_FORMATTER.format(LocalDate.now()));
    mapWithFormatted(parameters, "dokumentTyp", "xxx");
    mapWithFormatted(parameters, "bic", inkassodaten.getBic());
    mapWithFormatted(parameters, "hausnummerBeitragszahler", "xxx");
    mapWithFormatted(parameters, "iban", "Grundfaehigkeit");
    mapWithFormatted(parameters, "istVoransicht", false);
    mapWithFormatted(parameters, "istTeilantrag", false);
    mapWithFormatted(parameters, "antragseinreichungsArt", "Unterschrift");
    mapWithFormatted(parameters, "logischJa", true);
    mapWithFormatted(parameters, "logischNein", false);
    mapWithFormatted(parameters, "name", "xxx");
    mapWithFormatted(parameters, "nameBeitragszahler", "xxx");
    if (partner.getNamenszusatz() != null) {
      mapWithFormatted(parameters, "namenszusatzBeitragszahler", partner.getNamenszusatz());
    }
    mapWithFormatted(parameters, "ortBeitragszahler", partner.getZustelladresse().getOrtsname());
    mapWithFormatted(
        parameters, "plzBeitragszahler", partner.getZustelladresse().getPostleitzahl());
    mapWithFormatted(parameters, "pnrBeitragszahler", partner.getPnr());
    mapWithFormatted(parameters, "rechtsformBeitragszahler", PartnerTyp.NATUERLICHE_PERSON);
    mapWithFormatted(parameters, "strasse", partner.getZustelladresse().getStrassenname());
    mapWithFormatted(
        parameters, "strasseBeitragszahler", partner.getZustelladresse().getStrassenname());
    mapWithFormatted(parameters, "titelBeitragszahler", natuerlichePerson.getTitel());
    mapWithFormatted(parameters, "vornameBeitragszahler", partner.getName());

    antragsnummerDruckdatenProvider.provideDruckdaten(angebot, parameters);

    druckDaten.setKategorie(DruckKategorie.MANDAT);
    druckDaten.setName(SEPAMANDAT_FO);
    druckDaten.setBenoetigtVermittlerDaten(true);
    druckDaten.setParameter(
        parameters.entrySet().stream()
            .map(entry -> new DruckParameter(entry.getKey(), entry.getValue()))
            .collect(Collectors.toList()));
    return druckDaten;
  }

  @Override
  public DruckDaten provideDruckdaten(Angebot angebot) {
    return null;
  }

  public boolean isResponsibleFor(
      DruckKategorie kategorie, Map<String, String> documentSpecificParam) {
    return kategorie == DruckKategorie.MANDAT;
  }

  @Override
  public boolean isResponsibleFor(Angebot angebot, Map<String, String> druckstueckKeys) {
    return super.isResponsibleFor(angebot, druckstueckKeys);
  }

  @Override
  public void mapWithFormatted(Map<String, Serializable> parameter, String key, Serializable value) {
    super.mapWithFormatted(parameter, key, value);
  }

  @Override
  public boolean matchDruckKategorie(Map<String, String> druckstueckKey, DruckKategorie druckKategorie) {
    return super.matchDruckKategorie(druckstueckKey, druckKategorie);
  }

  @Override
  public boolean isAntragValidMarkedSet(Map<String, String> druckstueckKeys) {
    return super.isAntragValidMarkedSet(druckstueckKeys);
  }
}

用于测试此 class 的单元测试 Class 如下所示:

package com.xxx.services.business.druck.provider;

import static com.xxx.services.business.commons.Constants.DATE_FORMATTER;
import static org.mockito.ArgumentMatchers.eq;
import com.xxx.services.TestUtil;
import com.xxx.services.business.druck.DruckDaten;
import com.xxx.business.druck.DruckKategorie;
import com.xxx.services.model.Angebot;
import java.time.LocalDate;
import java.util.Arrays;
import org.assertj.core.api.SoftAssertions;
import org.assertj.core.api.WithAssertions;
import org.assertj.core.api.junit.jupiter.SoftAssertionsExtension;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
@SuppressWarnings("java:S2970")
@ExtendWith(SoftAssertionsExtension.class)
class DruckDatenProviderSepaMandatTest implements WithAssertions {


  @Mock AntragsnummerDruckdatenProvider antragsnummerDruckdatenProvider;

  @InjectMocks
  DruckDatenProviderSepaMandat druckDatenProviderSepaMandat;

  @Test
  public void provideDruckdatenTest(SoftAssertions softly) {
    // GIVEN
    Angebot angebot = TestUtil.createAngebot();

    // WHEN
    DruckDaten druckDaten = druckDatenProviderSepaMandat.provideDruckdaten(angebot);

    // THEN
    softly.assertThat(druckDaten).isNotNull();
    softly
        .assertThat(druckDaten.get("antragsDatum"))
        .isEqualTo(DATE_FORMATTER.format(LocalDate.now()));
    softly.assertThat(druckDaten.get("rechtsformBeitragszahler")).isEqualTo("Privatperson");
    softly.assertThat(druckDaten.get("namenszusatzBeitragszahler")).isEqualTo("Namenszusatz");
    softly.assertThat(druckDaten.get("titelBeitragszahler")).isEqualTo("Graf");
    softly.assertThat(druckDaten.get("vornameBeitragszahler")).isEqualTo("xxx");
    softly.assertThat(druckDaten.get("nameBeitragszahler")).isEqualTo("xxx");
    softly.assertThat(druckDaten.get("pnrBeitragszahler")).isEqualTo("xxx");
    softly.assertThat(druckDaten.get("plzBeitragszahler")).isEqualTo("xxx");
    softly.assertThat(druckDaten.get("ortBeitragszahler")).isEqualTo("xxx");
    softly.assertThat(druckDaten.get("strasseBeitragszahler")).isEqualTo("xxx.");
    softly.assertThat(druckDaten.get("hausnummerBeitragszahler")).isEqualTo("x");
    softly.assertThat(druckDaten.get("iban")).isEqualTo("xxxxxxxxxxxxxxxxx0000");
    softly.assertThat(druckDaten.get("bic")).isEqualTo("BIC00000000");
    softly.assertThat(druckDaten.get("bank")).isEqualTo("Kreditinstitut");
  }

  @Test
  public void antragsnummerTest(SoftAssertions softly) {
    Angebot angebot = TestUtil.createAngebot();
    angebot.getAntrag().setAntragsnummer("xxx");

    // THEN
    DruckDaten daten = druckDatenProviderSepaMandat.provideDruckdaten(angebot);

    Mockito.verify(antragsnummerDruckdatenProvider, Mockito.times(1))
        .provideDruckdaten(eq(angebot), Mockito.anyMap());
  }

  @Test
  public void isResponsibleFor(SoftAssertions softly) {
    softly
        .assertThat(druckDatenProviderSepaMandat.isResponsibleFor(DruckKategorie.MANDAT, null))
        .isTrue();

    Arrays.stream(DruckKategorie.values())
        .filter(druckKategorie -> DruckKategorie.MANDAT != druckKategorie)
        .forEach(
            kategorie ->
                softly
                    .assertThat(druckDatenProviderSepaMandat.isResponsibleFor(kategorie, null))
                    .isFalse());
  }
}

测试 Class 失败并出现以下错误,虽然我投入了大量的网络研究,但我自己也无法弄明白;因此,如果能提供有关如何解决此错误以及如何使测试 Class 再次运行的任何有用提示,我将非常高兴:

Wanted but not invoked:
antragsnummerDruckdatenProvider.provideDruckdaten(
    Angebot(angebotId=null, angebotApiId=null, warenkorbApiId=xxx, provisionsbeitragssumme=null, antrag=Antrag(antragId=null, antragsnummer=xxx, antragsteller=Antragsteller(antragstellerId=null, gbs=00, partnerdaten=Partner(partnerId=null, natuerlichePerson=NatuerlichePerson(natuerlichePersonId=null, anrede=EINTRAG2, anredezusatz=null, titel=xxx, vorname=xxx, geburtsname=null, geburtsort=null, geburtsdatum=xxx, familienstand=UNBEKANNT, beruf=Experte), zustelladresse=Zustelladresse(zustelladresseId=null, laenderkennzeichen=EINTRAG51, postleitzahl=xxx, ortsname=xxx, ortsteilname=xxx, strassenname=xxx, hausnummer=x, adressmerkmal=EINTRAG0, adresszusatz=zusatz), onlineAdressen=[], telekommunikation=[], partnerTyp=NATUERLICHE_PERSON, rechtsform=EINTRAG1, name=xxx, namenszusatz=Namenszusatz, nationalitaet=EINTRAG0, pnr=xxx, arbeitgeber=null, branche=null, steuerid=null, telefonkontakt=null, partnergemeinschaftsart=null), brancheGbs=SONSTIGE, arbeitsverhaeltnisGbs=OHNE_TAETIGKEIT, vorhandeneAnbuendelungen=[xxx], sondervereinbarungArbeitgeber=[Sondervereinbarung(id=null, agpnr=null, agname=Arbeitgeber, agvereinb1=null, agvereinb2=null, agpnrLeben=null)], sondervereinbarungMitgliedschaften=[Sondervereinbarung(id=null, agpnr=null, agname=Mitgliedschaft, agvereinb1=null, agvereinb2=null, agpnrLeben=null)], bezugsperson=Bezugsperson(id=null, vorname=xxx, nachname=xxx, arbeitgeber=xxx, verwandtschaftsgrad=drei, gemeinsamerHaushalt=JA)), versichertePerson=VersichertePerson(id=null, gbs=null, partnerdaten=Partner(partnerId=null, natuerlichePerson=NatuerlichePerson(natuerlichePersonId=null, anrede=EINTRAG2, anredezusatz=null, titel=null, vorname=xxx, geburtsname=null, geburtsort=null, geburtsdatum=xxx, familienstand=UNBEKANNT, beruf=xxx), zustelladresse=Zustelladresse(zustelladresseId=null, laenderkennzeichen=EINTRAG51, postleitzahl=xxx, ortsname=xxx, ortsteilname=xxx, strassenname=xxx., hausnummer=x, adressmerkmal=EINTRAG0, adresszusatz=zusatz), onlineAdressen=[], telekommunikation=[], partnerTyp=NATUERLICHE_PERSON, rechtsform=EINTRAG1, name=Blöd, namenszusatz=null, nationalitaet=EINTRAG0, pnr=null, arbeitgeber=null, branche=null, steuerid=null, telefonkontakt=null, partnergemeinschaftsart=null), brancheGbs=null, arbeitsverhaeltnisGbs=null, compassInformation=CompassInformation(id=null, arbeitsverhaeltnis=ANGESTELLTE, berufsgruppe=BERUFSGRUPPE_1, risikoklasse=RISIKOKLASSE_1, xxx=xxx, xxx=null, berufsId=null), gesundheitsfragen=Gesundheitsfragen(id=null, anzeigepflichtbelehrungAnswer=false, beantworteteGesundheitsfragen=[]), xxx=false, xxx=xxx(id=null, mhsGewuenscht=JA, terminvereinbarungsart=PER_EMAIL, email=test@web.de, telefonnummer=Telekommunikation(telekommunikationId=null, telekommunikationArt=PRIVAT, telekommunikationTyp=FESTNETZ, landvorwahl=+49, vorwahl=xxx, rufnummer=xxx), zustelladresse=Zustelladresse(zustelladresseId=null, laenderkennzeichen=EINTRAG51, postleitzahl=xxx, ortsname=xxx, ortsteilname=xxx, strassenname=xxx, hausnummer=x, adressmerkmal=EINTRAG0, adresszusatz=zusatz), telefonischVon=xxx, telefonischBis=xxx, xxx=JA, xxx=aua)), bezugsberechtigtePerson=BezugsberechtigtePerson(id=0, naeheverhaeltnis=UNBEKANNT, artBezugsrechtErleben=WIDERRUFLICH, xxx=VERSICHERTE_PERSON, artNaeheverhaeltnis=null, gbs=null, brancheGbs=null, arbeitsverhaeltnisGbs=null, partnerdaten=Partner(partnerId=null, natuerlichePerson=NatuerlichePerson(natuerlichePersonId=null, anrede=EINTRAG2, anredezusatz=null, titel=null, vorname=xxx, geburtsname=null, geburtsort=null, geburtsdatum=xxx, familienstand=UNBEKANNT, beruf=xxx), zustelladresse=Zustelladresse(zustelladresseId=null, laenderkennzeichen=EINTRAG51, postleitzahl=xxx, ortsname=xxx, ortsteilname=xxx, strassenname=xxx, hausnummer=x, adressmerkmal=EINTRAG0, adresszusatz=zusatz), onlineAdressen=[], telekommunikation=[], partnerTyp=NATUERLICHE_PERSON, rechtsform=EINTRAG1, name=xxx, namenszusatz=null, nationalitaet=EINTRAG0, pnr=null, arbeitgeber=null, branche=null, steuerid=null, telefonkontakt=null, partnergemeinschaftsart=null)), beitragszahler=Beitragszahler(beitragszahlerId=null, gbs=null, partnerdaten=Partner(partnerId=null, natuerlichePerson=NatuerlichePerson(natuerlichePersonId=null, anrede=EINTRAG2, anredezusatz=null, titel=xxx, vorname=xxx, geburtsname=null, geburtsort=null, geburtsdatum=xxx, familienstand=UNBEKANNT, beruf=Experte), zustelladresse=Zustelladresse(zustelladresseId=null, laenderkennzeichen=EINTRAG51, postleitzahl=xxx, ortsname=xxx, ortsteilname=xxx, strassenname=xxx, hausnummer=x, adressmerkmal=EINTRAG0, adresszusatz=zusatz), onlineAdressen=[], telekommunikation=[], partnerTyp=NATUERLICHE_PERSON, rechtsform=EINTRAG1, name=xxx, namenszusatz=Namenszusatz, nationalitaet=EINTRAG0, pnr=xxx, arbeitgeber=null, branche=null, steuerid=null, telefonkontakt=null, partnergemeinschaftsart=null), brancheGbs=null, arbeitsverhaeltnisGbs=null, antragstellerGleichBeitragszahler=JA, inkassodaten=Inkassodaten(inkassodatenId=null, zahlungsart=LASTSCHRIFT, iban=xxx, bic=xxx, kreditinstitut=Kreditinstitut, mandatsreferenznummer=null, ibanErrorCode=null)), vermittlerdaten=xxx.services.model.xxx, beratungsprotokoll=Beratungsprotokoll(id=null, beratungZuSpaeteremTerminErwuenscht=NEIN, spaetereBeratungDatum=null, zusaetzlicheHinweiseAntragstellerVorhanden=NEIN, zusaetzlicheHinweiseAntragstellerText=null, beratenePersonNichtAntragsteller=NEIN, verhaeltnisBeratenePersonZumAntragsteller=null, beratenePerson=null, weitereTeilnehmerVorhanden=NEIN, ersterWeitererTeilnehmer=null, zweiterWeitererTeilnehmer=null, dritterWeitererTeilnehmer=null), aktionsnummer=null, aufnahmeort=EINTRAG0, kundeninformationMedium=DATEI_EMAIL, kundeninformationStand=null, nebenabredenVorhanden=NEIN, nebenabreden=null, endeSchulzeit=null, schweigepflichtentbindungErlebensfall=null, schweigepflichtentbindungTodesfall=null, kundeninformationEmailVersandt=false, antragValid=false), unternehmensKennzeichen=N, besondereAntragsaufnahme=NEIN, beratungsfragen=[Beratungsfrage(id=null, absicherung=null, type=BEITRAGS_DYNAMIK), Beratungsfrage(id=null, absicherung=null, type=SCHWERE_KRANKHEITEN), Beratungsfrage(id=null, absicherung=null, type=JAEHRLICHE_ERHOEHUNG_LEISTUNGSFALL), Beratungsfrage(id=null, absicherung=null, type=KRANKENTAGEGELD)], produktlinienfragen=[Produktlinienfrage(id=null, type=VERLUST_GLEICHGEWICHTSINN, ausgewaehlt=null), Produktlinienfrage(id=null, type=VERLUST_FINGERFERTIGKEIT, ausgewaehlt=null), Produktlinienfrage(id=null, type=VERLUST_INTELLEKTUELLE_FAEHIGKEITEN, ausgewaehlt=null), Produktlinienfrage(id=null, type=PLUS_EMPFOHLEN, ausgewaehlt=null), Produktlinienfrage(id=null, type=VERLUST_FAEHIGKEIT_EIGENVERANTWORTLICHES_HANDELN, ausgewaehlt=null), Produktlinienfrage(id=null, type=VERLUST_FAEHIGKEIT_AUTOFAHREN, ausgewaehlt=null)], risiken=[Risiko(id=null, kosten=Kosten(kostenId=null, gesamtzillmerKosten=4.45, amortisationsKosten=20.0, prozentualeAmortisationskosten=4.2, prozentualeUngezillmerteAbschlussAmortisationsKosten=4, absoluteUngezillmerteAbschlusskosten=25.0, prozentualeUngezillmerteAbschlusskosten=33.33, prozentualeEinmaligeGezillmerteAbschlusskosten=1.23, verwaltungsKosten=18.2, verwaltungsKostenLeistung=25.66, verwaltungsKostenBeitragsfrei=30.9, prozentualeVerwaltungskostenBeitrag=5, prozentualeVerwaltungskostenBeitragsfrei=5, absoluteAusProzentualeVerwaltungskostenBeitragsfrei=null, absoluteVerwaltungskostenLeistungsfall=400), risikoKennung=KRANKHEIT, tarifkennung=xxxx, tarifgeneration=2018_07, ueberschussverwendungssystem=VORWEGABZUG, leistungsende=2059-10-01, versicherungsende=2060-10-01, beitragszahlungsende=2058-10-01, beitrag=50, vorwegabzug=5, rente=null, versicherungssumme=24000), Risiko(id=null, kosten=Kosten(kostenId=null, gesamtzillmerKosten=12.45, amortisationsKosten=20.0, prozentualeAmortisationskosten=4.2, prozentualeUngezillmerteAbschlussAmortisationsKosten=4, absoluteUngezillmerteAbschlusskosten=25.0, prozentualeUngezillmerteAbschlusskosten=33.33, prozentualeEinmaligeGezillmerteAbschlusskosten=1.23, verwaltungsKosten=18.2, verwaltungsKostenLeistung=25.66, verwaltungsKostenBeitragsfrei=30.9, prozentualeVerwaltungskostenBeitrag=5, prozentualeVerwaltungskostenBeitragsfrei=5, absoluteAusProzentualeVerwaltungskostenBeitragsfrei=null, absoluteVerwaltungskostenLeistungsfall=null), risikoKennung=GRUNDFAEHIGKEIT, tarifkennung=GF, tarifgeneration=2018_07, ueberschussverwendungssystem=VORWEGABZUG, leistungsende=2056-10-01, versicherungsende=2057-10-01, beitragszahlungsende=2055-10-01, beitrag=100, vorwegabzug=15, rente=1000, versicherungssumme=null)], verlaeufe=[Verlaufzeile(verlaufzeileId=null, verlauftyp=GARANTIE_LEISTUNG_WERTE_OHNE_DYNAMIK, verlaufzeileIndex=0, verlaufzeileDatum=2021-05-15, beitragGesamt=10.1, renteGrundfaehigkeit=120.12, renteBeitragsfreiGrundfaeigkeit=11.11, versicherungssummeBeitragsfreiSchwereKrankheiten=13.13, stornoabschlag=5.0), Verlaufzeile(verlaufzeileId=null, verlauftyp=GARANTIE_LEISTUNG_WERTE_OHNE_DYNAMIK, verlaufzeileIndex=1, verlaufzeileDatum=2022-05-15, beitragGesamt=20.2, renteGrundfaehigkeit=230.22, renteBeitragsfreiGrundfaeigkeit=22.22, versicherungssummeBeitragsfreiSchwereKrankheiten=23.23, stornoabschlag=10.0), Verlaufzeile(verlaufzeileId=null, verlauftyp=GARANTIE_LEISTUNG_WERTE_MIT_DYNAMIK, verlaufzeileIndex=0, verlaufzeileDatum=2021-05-15, beitragGesamt=90.9, renteGrundfaehigkeit=920.92, renteBeitragsfreiGrundfaeigkeit=99.99, versicherungssummeBeitragsfreiSchwereKrankheiten=93.93, stornoabschlag=5.0)], vorversicherungsnummer=123456785, aktuellerStatus=UNVOLLSTAENDIG, bavGewuenscht=JA, vitaProtectGewuenscht=NEIN, produktEmpfehlung=GF, mitReduziertenAnfangsbeitraegen=DYNAMIK_UND_NACHVERSICHERUNGSGARANTIE, zahlungsrhythmus=VIERTELJAEHRLICH, prozentsatzDynamik=DYNAMIK_03, prozentsatzDynamikArt=INDIVIDUELL, berechnungsBasis=_RENTE, prozentsatzRentensteigerung=DYNAMIK_01, zahlungsrhythmusRente=MONATLICH, versicherungsbeginn=2020-06-01, mitPlusPaket=JA, mitSchwereKrankheiten=JA, berechnungsBasisBeitrag=150, berechnungsBasisRente=1000, gesamtBeitrag=333.33, berechnungsBasisDatum=ENDALTER, versicherungsEndalter=65, beitragszahlungsEndalter=66, leistungsEndalter=67, versicherungsDauerInMonaten=165, beitragszahlungsDauerInMonaten=266, leistungsDauerInMonaten=367, endalterMonatsgenauZumGeburtsdatum=JA, angebotValid=false),
    <any map>
);
-> at com.devk.vpu.grundfaehigkeit.services.business.druck.provider.DruckDatenProviderSepaMandatTest.antragsnummerTest(DruckDatenProviderSepaMandatTest.java:70)
Actually, there were zero interactions with this mock.

Wanted but not invoked:

(...) -> 在 com.xxx.DruckDatenProviderSepaMandatTest.antragsnummerTest(DruckDatenProviderSepaMandatTest.java:70) 实际上,与此模拟的交互为零。

    at com.xxx.provider.DruckDatenProviderSepaMandatTest.antragsnummerTest(DruckDatenProviderSepaMandatTest.java:70)
    at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725)
    at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
    at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
    at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
    at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
    at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod[=14=](ExecutableInvoker.java:115)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke[=14=](ExecutableInvoker.java:105)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod(TestMethodTestDescriptor.java:214)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:151)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:141)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:155)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:141)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:155)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:141)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute[=14=](EngineExecutionOrchestrator.java:54)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
    at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
    at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)
    at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.execute(IdeaTestRunner.java:38)
    at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)

您的模拟匹配项可能不匹配。您提供了一个 'angebot' 但这是一个新对象,在实际调用期间与 'angebot' 不匹配。我认为使用 'any()' 之类的东西是更好的选择。

provideDruckdaten(eq(angebot), Mockito.anyMap())