wanneer ik de mockito-test uitvoer, treedt WrongTypeOfReturnValue-uitzondering op

Foutdetail:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
Boolean cannot be returned by updateItemAttributesByJuId()
updateItemAttributesByJuId() should return ResultRich
This exception might occur in wrongly written multi-threaded tests.
Please refer to Mockito FAQ on limitations of concurrency testing.

mijn code :

@InjectMocks
protected ItemArrangeManager arrangeManagerSpy = spy(new ItemArrangeManagerImpl());
@Mock
protected JuItemWriteService juItemWriteService;
when(arrangeManagerSpy
    .updateItemAttributes(mapCaptor.capture(), eq(juId), eq(itemTO.getSellerId())))
    .thenReturn(false);

Zoals je kunt zien, bel ik whenop updateItemAttributes(wat wel een booleanretourneert) niet op updateItemAttributesByJuId.

  1. Waarom probeert Mockito een booleanvan updateItemAttributesByJuIdte retourneren?
  2. Hoe kan dit worden verholpen?

Antwoord 1, autoriteit 100%

Volgens https://groups.google.com/forum/?fromgroups#!topic /mockito/9WUvkhZUy90, herformuleer uw

when(bar.getFoo()).thenReturn(fooBar)

naar

doReturn(fooBar).when(bar).getFoo()

Antwoord 2, autoriteit 17%

Een andere reden voor een gelijkaardige foutmelding is het spotten van een finalmethode. Men moet niet proberen om de laatste methoden te bespotten (zie Final method-spotten).

Ik heb de fout ook onder ogen gezien in een multi-threaded test. Antwoord van gna werkte in dat geval.


Antwoord 3, autoriteit 12%

Zeer interessant probleem.
In mijn geval werd dit probleem veroorzaakt toen ik probeerde mijn tests op deze soortgelijke regel te debuggen:

Boolean fooBar;
when(bar.getFoo()).thenReturn(fooBar);

De belangrijke opmerking is dat de tests correct verliepen zonder foutopsporing.

Toen ik de bovenstaande code verving door het onderstaande codefragment, kon ik op de een of andere manier de probleemregel zonder problemen debuggen.

doReturn(fooBar).when(bar).getFoo();

Antwoord 4, autoriteit 4%

Voor mij betekende dit dat ik dit deed:

a = Mockito.mock(SomeClass.class);
b = new RealClass();
when(b.method1(a)).thenReturn(c); 
// within this method1, it calls param1.method2() -- note, b is not a spy or mock

Dus wat er gebeurde, is dat mockito detecteerde dat a.method2()werd aangeroepen en me vertelde dat ik cniet kon retourneren van a.method2()wat niet klopt.

Fix: gebruik de doReturn(c).when(b).method1(a)stijlsyntaxis (in plaats van when(b.method1(a)).thenReturn(c);), waarmee u de verborgen bug beknopter en sneller kunt ontdekken.

Of in dit specifieke geval, nadat ik dat had gedaan, begon het de nauwkeurigere “NotAMockException” weer te geven, en ik veranderde het om niet langer te proberen een retourwaarde in te stellen van een niet-schijnobject.


Antwoord 5, autoriteit 2%

Ik had onlangs dit probleem. Het probleem was dat de methode die ik probeerde te bespotten geen toegangsmodifier had. Publiek toevoegen loste het probleem op.


Antwoord 6, autoriteit 2%

Ik had deze fout omdat ik in mijn test twee verwachtingen had, een op een schijnvertoning en een op een concreet type

MyClass cls = new MyClass();
MyClass cls2 = Mockito.mock(Myclass.class);
when(foo.bar(cls)).thenReturn(); // cls is not actually a mock
when(foo.baz(cls2)).thenReturn();

Ik heb het opgelost door cls ook als nep te veranderen


Antwoord 7, autoriteit 2%

In mijn geval werd het probleem veroorzaakt door te proberen een statische methode te bespotten en te vergeten mockStaticaan te roepen in de klas. Ook vergat ik de klas op te nemen in de @PrepareForTest()


Antwoord 8

In mijn geval gebruikte ik zowel @RunWith(MockitoJUnitRunner.class)als MockitoAnnotations.initMocks(this). Toen ik MockitoAnnotations.initMocks(this)verwijderde, werkte het correct.


Antwoord 9

Als u annotaties gebruikt, moet u mogelijk @Mock gebruiken in plaats van @InjectMocks. Omdat @InjectMocks werkt als @Spy en @Mock samen. En @Spy houdt recent uitgevoerde methoden bij en u kunt het gevoel hebben dat onjuiste gegevens worden geretourneerd/subbed.


Antwoord 10

TL;DRAls sommige argumenten in uw test nullzijn, zorg er dan voor dat u de parameteraanroep bespot met isNull()in plaats van anyXXX().


Ik kreeg deze fout bij het upgraden van Spring boot 1.5.x naar 2.1.x. Spring Boot wordt geleverd met zijn eigen Mockito, die nu ook is geüpgraded naar 2.x (zie bijv. Afhankelijkheden van Spring boot 2.1.2)

Mockito heeft het gedrag veranderd voor de anyXXX()methode, waarbij XXXString, Longis, etc. Hier is de javadoc van anyLong():

Sinds Mockito 2.1.0 alleen de waarde Longtoestaan, dus
nullis geen geldige waarde meer Als primitieve wrappers
zijn nullable, de voorgestelde API die overeenkomt
nullwrapper zou #isNull()zijn. We voelden deze verandering
zou het testen van het harnas veel veiliger maken dan bij Mockito
1.x.

Ik stel voor dat je debugt tot het punt waarop je mock op het punt staat te worden aangeroepen en te inspecteren, of ten minste één-argument nullis. Zorg er in dat geval voor dat u uw mock voorbereidt met isNull()in plaats van b.v. anyLong().

Dus dit:

when(MockedClass.method(anyString());

wordt:

when(MockedClass.method(isNull());

Antwoord 11

Fout:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
Tekenreeks kan niet worden geretourneerd door size()
size() moet int
teruggeven
***
Als je niet zeker weet waarom je bovenstaande foutmelding krijgt, lees dan verder.
Vanwege de aard van de bovenstaande syntaxis kan er een probleem optreden omdat:
1. Deze uitzondering kanvoorkomen in verkeerd geschreven multi-threaded
testen.
Raadpleeg de veelgestelde vragen van Mockito over beperkingen van gelijktijdigheidstesten.
2. Een spion wordt gestopt met de syntaxis when(spy.foo()).then() . Het is veiliger om
stompe spionnen –
– met doReturn|Throw() familie van methoden. Meer in javadocs voor
Mockito.spy() methode.

Werkelijke code:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ Object.class, ByteString.class})
@Mock
private ByteString mockByteString;
String testData = “dsfgdshf”;
PowerMockito.when(mockByteString.toStringUtf8()).thenReturn(testData); 
// throws above given exception

Oplossing om dit probleem op te lossen:

Eerste verwijder annotatie “@Mock”.

private ByteString mockByteString;

2e toevoegen PowerMockito.mock

mockByteString = PowerMockito.mock(ByteString.class);

Antwoord 12

Ik ben onlangs dit probleem tegengekomen tijdens het spotten van een functie in een Kotlin-gegevensklasse. Om een ​​onbekende reden belandde een van mijn testruns in een bevroren toestand. Toen ik de tests opnieuw uitvoerde, begonnen sommige van mijn eerder geslaagde tests te mislukken met de uitzondering WrongTypeOfReturnValue.

Ik zorgde ervoor dat ik org.mockito:mockito-inlinegebruikte om de problemen met de eindklassen (vermeld door Arvidaa) te vermijden, maar het probleem bleef. Wat het voor mij oploste, was om het proces te beëindigen en Android Studio opnieuw op te starten. Dit beëindigde mijn bevroren testrun en de volgende testruns slaagden zonder problemen.


Antwoord 13

Ontbreekt @MockBean op de boon die je wilt bespotten


Antwoord 14

Ik kreeg dit probleem WrongTypeOfReturnValueomdat ik een methode bespotte die een java.util.Optional;retourneerde met een com.google.common.base.Optional;omdat mijn formatter automatisch ontbrekende imports toevoegt.

Mockito zei me net dat “methode iets() Optioneel zou moeten retourneren”…


Antwoord 15

In mijn geval is de bean geïnitialiseerd met @Autowiredannotatie in plaats van @MockBean

Dus op deze manier veroorzaakt het bespotten van DAO’s en Services zo’n uitzondering


Antwoord 16

Voor mij was het probleem de multithreaded-tests die stubbing/verificatie deden op gedeelde mocks. Het leidde tot het willekeurig gooien van WrongTypeOfReturnValue-uitzondering.

Dit is geen correct geschreven test met Mockito.
Mocks mogen niet worden geopend vanuit meerdere threads.

De oplossing was om mocks lokaal te maken voor elke test.


Antwoord 17

In mijn geval, of liever de instrumentatietests van het Android-project,
Ik moest alleen de map buildverwijderen (om opnieuw opbouwen te forceren).

Misschien zijn er te veel redenen voor één enkele fout!
(ze zouden dit al moeten oplossen).

Maar ik hoop dat dit iemand helpt
d= (◕‿↼ )


Antwoord 18

Ik gebruik Scala en ik krijg dit bericht waarin ik per ongeluk een Mock heb gedeeld tussen twee Objects. Zorg er dus voor dat uw tests onafhankelijk van elkaar zijn. De uitvoering van de parallelle test zorgt natuurlijk voor wat wankele situaties, aangezien de objecten in Scala singleton-composities zijn.


Antwoord 19

In mijn geval blijkt dat het type bespot object eigenlijk een abstracte interface is, het probleem wordt opgelost nadat het type is gewijzigd in een implementatieklasse,

Wijzigen

@Mock
private Proxy proxy;

naar

@Mock
private ProxyImpl proxy;

Antwoord 20

Dit is mijn geval:

//given
ObjectA a = new ObjectA();
ObjectB b = mock(ObjectB.class);
when(b.call()).thenReturn(a);
Target target = spy(new Target());
doReturn(b).when(target).method1();
//when
String result = target.method2();

Dan krijg ik deze foutmelding:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
ObjectB$$EnhancerByMockitoWithCGLIB$$2eaf7d1d cannot be returned by method2()
method2() should return String

Kun je raden?

Het probleem is dat Target.method1() een statische methode is. Mockito waarschuwt me volledig voor iets anders.

Other episodes