Mockito testini çalıştırdığımda WrongTypeOfReturnValue Exception oluşuyor


96

Hata ayrıntısı:

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.

benim kodum:

@InjectMocks
protected ItemArrangeManager arrangeManagerSpy = spy(new ItemArrangeManagerImpl());
@Mock
protected JuItemWriteService juItemWriteService;

when(arrangeManagerSpy
    .updateItemAttributes(mapCaptor.capture(), eq(juId), eq(itemTO.getSellerId())))
    .thenReturn(false);

Gördüğünüz gibi, whenaçık değil updateItemAttributes(a döndürür boolean) diye sesleniyorum updateItemAttributesByJuId.

  1. Neden mockito bir dönmeye çalışıyor booleanden updateItemAttributesByJuId?
  2. Bu nasıl düzeltilebilir?

Yanıtlar:


199

Https://groups.google.com/forum/?fromgroups#!topic/mockito/9WUvkhZUy90'a göre ,

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

-e

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

3
Bu harika bir ipucu. @Aspect@Repository ile bazı Spring DAO yöntemlerini test ederken de bu sorunu yaşıyordum . yaparsam when(someDao.someMethod()).thenReturn(List<xxx>), bu WrongTypeOfReturnValue istisnasını aldım. Hata ayıklama yoluyla, someMethodyöntemin aslında yukarıdaki ifadede çağrıldığını ve Around Advice'ı tetiklediğini ve bir geri döndüğünü nullancak Mockito'nun bir List<xxx>.
LeOn - Han Li

Benim için çalıştı. Obrigado!
Saksafoncu

Mükemmel Cevap. Günümü kurtardı.
user3198259

Benim için de çalıştı! Teşekkürler! Yine de verilen bağlantıdaki açıklamayı tam olarak anlamadım.
georgeliatsos


20

Çok ilgili bir sorun. Benim durumumda bu sorun, bu benzer satırdaki testlerimde hata ayıklamaya çalıştığımda ortaya çıktı:

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

Önemli not, testlerin hata ayıklama olmadan doğru şekilde çalıştığıdır.

Herhangi bir şekilde, yukarıdaki kodu aşağıdaki kod parçacığı ile değiştirdiğimde, sorun satırını sorunsuz bir şekilde ayıklayabildim.

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

Teşekkürler, Kotlin veri sınıflarında alanlarla aynı sorun var gibi görünüyor ve çözümünüz bunu çözdü!
Mohsen Mirhoseini

6

Benim için bu, bunu çalıştırdığım anlamına geliyordu:

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

Ne olup bittiğini olduğunu Böylece Mockito olduğunu tespit edildi a.method2()denilen ediliyordu ve ben dönmek olamazdı bana cgelen a.method2()hangi yanlıştır.

Düzeltme: gizli hatayı daha kısa ve öz bir şekilde keşfetmenize yardımcı olacak doReturn(c).when(b).method1(a)stil sözdizimini (yerine when(b.method1(a)).thenReturn(c);) kullanın .

Veya bu özel durumda, bunu yaptıktan sonra, daha doğru "NotAMockException" göstermeye başladı ve artık sahte olmayan bir nesneden bir dönüş değeri ayarlamayı denemeyecek şekilde değiştirdim.


1
Benim de yaptığım hatanın aynısı. Yöntem1'de kullanılan yöntemle alay ettim, çalıştırdım ve bu istisnayı aldım. Bu kodu kaldırdıktan sonra çözüldü.
Praveen. 833

5

Geçenlerde bu sorunu yaşadım. Sorun, dalga geçmeye çalıştığım yöntemin erişim değiştiricisinin olmamasıydı. Halkın eklenmesi sorunu çözdü.


5

Bu hatayı aldım çünkü testimde biri sahte, diğeri somut tipte olmak üzere iki beklentim vardı.

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();

Cls'yi sahte olacak şekilde değiştirerek düzelttim


4

Benim durumumda sorun, statik bir yöntemle dalga geçmeye çalışmak mockStaticve sınıfı çağırmayı unutmaktan kaynaklanıyordu . Ayrıca sınıfı dahil etmeyi unuttum@PrepareForTest()


2

Ek açıklamaları kullanıyorsanız, @InjectMocks yerine @Mock kullanmanız gerekebilir. Çünkü @InjectMocks, @Spy ve @Mock birlikte çalışır. Ve @ Spy, yakın zamanda yürütülen yöntemleri takip eder ve yanlış verilerin iade edildiğini / alt edildiğini hissedebilirsiniz.


2
" birlikte ve birlikte @InjectMocksçalışır ." <- bu bana yanlış geliyor. Bunu nereden duydunuz? @Spy@Mock
Etienne Miret

2

Benim durumumda, hem @RunWith(MockitoJUnitRunner.class)ve kullanıyordum MockitoAnnotations.initMocks(this). Çıkardığımda MockitoAnnotations.initMocks(this)doğru çalıştı.


1

Hata:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
Dize boyuta göre döndürülemez ()
size () int döndürmelidir
***
Eğer neden yukarıda hata aldığınızdan emin değilseniz okumaya devam edin.
Yukarıdaki sözdiziminin doğası gereği sorun şu nedenlerle ortaya çıkabilir:
1. Bu özel durum , yanlış yazılmış çok iş parçacıklı
testlerde ortaya çıkabilir .
Lütfen eşzamanlılık testinin sınırlamaları için Mockito SSS bölümüne bakın.
2. Bir casus, when (spy.foo ()) ve ardından () sözdizimi kullanılarak stub edilir. DoReturn | Throw () yöntem ailesi ile
casusları
saplamak daha güvenlidir .
Mockito.spy () yöntemi için javadocs'ta daha fazlası .

Gerçek Kod:

@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

Bu sorunu çözmek için çözüm:

1. “@Mock” ​​ek açıklamasını kaldırın.

private ByteString mockByteString;

2. Ekle PowerMockito.mock

mockByteString = PowerMockito.mock(ByteString.class);

1

Geçenlerde bir Kotlin veri sınıfındaki bir işlevle dalga geçerken bu sorunla karşılaştım . Bilinmeyen bir nedenden ötürü, test çalışmalarımdan biri donmuş durumda kaldı. Testleri tekrar çalıştırdığımda, daha önce geçmiş olan bazı testlerim WrongTypeOfReturnValueistisna ile başarısız olmaya başladı .

org.mockito:mockito-inlineSon sınıflarla ilgili sorunlardan kaçınmak için kullandığımdan emin oldum (Arvidaa'nın bahsettiği), ancak sorun devam etti. Benim için çözen şey , süreci öldürmek ve Android Studio'yu yeniden başlatmaktı . Bu, donmuş test çalıştırmamı sonlandırdı ve aşağıdaki test çalışmaları sorunsuz geçti.


1

Alay etmek istediğiniz fasulye üzerinde @MockBean eksik


1

Bu sorunu aldım WrongTypeOfReturnValueçünkü formatlayıcımın eksik içe aktarmaları otomatik olarak eklediği için java.util.Optional;a döndüren bir yöntemle alay com.google.common.base.Optional;ettim.

Mockito sadece bana "method birşey () 'in İsteğe Bağlı döndürmesi gerektiğini" söylüyordu ...


1

Benim durumumda fasulye kullanılarak başlatıldı @Autowired yerine ek açıklama @MockBean

Bu şekilde, DAO'ların ve Hizmetlerin alay edilmesi, böyle bir istisna yaratır


1
Evet, benim durumumda bir Spring-Boot uygulama Servis testi, MockBean bir Bean ile alay ederken kullanılmalıdır. Teşekkürler!
Isaac Philip

1

Benim için sorun, paylaşılan bir taklit üzerinde saplama / doğrulama yapan çok iş parçacıklı testlerdi. Rastgele bir WrongTypeOfReturnValueistisna atılmasına yol açtı .

Bu, Mockito kullanılarak düzgün bir şekilde yazılmış test değildir. Taklitlere birden çok iş parçacığından erişilmemelidir.

Çözüm, her test için yerel alaylar yapmaktı.


1

TL; DR Testinizdeki bazı bağımsız değişkenler nullgeçerliyse, parametre çağrısı isNull()yerine ile alay ettiğinizden emin olun anyXXX().


Spring boot 1.5.x'ten 2.1.x'e yükseltme yaparken bu hatayı aldım. Spring boot, artık 2.x'e yükseltilen kendi Mockito'yla birlikte gelir (bkz. Örn. , Spring boot 2.1.2 Bağımlılıkları )

Mockito için davranışı değişti anyXXX()yöntemle, XXXolduğu String, Longİşte vb javadoc taşımaktadır anyLong():

Mockito 2.1.0'dan beri, yalnızca izin verilen değerdir Long, dolayısıyla nullartık geçerli bir değer değildir İlkel sarmalayıcılar boş değer atanabildiğinden, sarmalayıcıyla eşleşmesi için önerilen API nullolacaktır #isNull(). Bu değişikliğin, testleri Mockito 1.x ile olduğundan çok daha güvenli hale getireceğini düşündük.

En az bir argüman olsun , alayınızın çağrılacağı ve inceleneceği noktaya kadar hata ayıklamanızı öneririm null. Bu durumda isNull(), örn anyLong(). Yerine ile alayınızı hazırladığınızdan emin olun .

Yani bu:

when(MockedClass.method(anyString());

şu hale gelir:

when(MockedClass.method(isNull());

-1

Bu benim durumum:

//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();

Sonra şu hatayı alıyorum:

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

Tahmin edebilir misin?

Sorun, Target.method1 () 'in statik bir yöntem olmasıdır. Mockito beni tamamen başka bir şeye karşı uyarıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.