PowerMockito.whenNew () ile dalga geçilmez ve orijinal yöntem çağrılır


104

Aşağıda buna benzer bir kodum var:

Class A {
  public boolean myMethod(someargs) {
    MyQueryClass query = new MyQueryClass();
    Long id = query.getNextId();
    // some more code
  }
}
Class MyQueryClass     {
  ....
  public Long getNextId() {
    //lot of DB code, execute some DB query
    return id;
  }
}

Şimdi için bir test yazıyorum A.myMethod(someargs). Gerçek yöntemi atlamak query.getNextId()ve bunun yerine bir saplama değeri döndürmek istiyorum . Temel olarak, dalga geçmek istiyorum MyQueryClass.

Bu yüzden test durumumda kullandım:

MyQueryClass query = PowerMockito.mock(MyQueryClass.class);
PowerMockito.whenNew(MyQueryClass.class).withNoArguments().thenReturn(query);
when(query.getNextId()).thenReturn(1000000L);

boolean b = A.getInstance().myMethod(args);

//asserts

Test dersimin başında @RunWith(PowerMockRunner.class)ve kullandım @PrepareForTest({MyQueryClass.class}).

Ancak testte hata ayıkladığımda, yine getNextId()de MyQueryClasssınıfın gerçek yöntemini çağırıyor .

Burada neyi özlüyorum? Mockito ve PowerMockito'da yeni olduğum için herkes yardımcı olabilir mi?

Yanıtlar:


230

Sen sınıf koymak gerekir yapıcı denir içine @PrepareForTestaçıklama yerine inşa ediliyor sınıfın - bakınız yeni nesnelerin Mock inşaatı .

Senin durumunda:

@PrepareForTest(MyQueryClass.class)

@PrepareForTest(A.class)

Daha genel:

@PrepareForTest(NewInstanceClass.class)

@PrepareForTest(ClassThatCreatesTheNewInstance.class)


1
Çok teşekkürler. @PrepareForTest'e mevcut sınıf Ör. A dahil edildikten sonra şimdi çalıştı.
user3942446

2
Bunun için de biraz zaman harcıyorum. Teşekkürler @TrueDub. Referans eski olduğu için. Sadece güncelliyorum. github.com/jayway/powermock/wiki/MockConstructor Diyor ki: Test senaryosunun sınıf düzeyinde @PrepareForTest (ClassThatCreatesTheNewInstance.class) ek açıklamasını kullanın.
Victor Choy

4
Ben aynı sorun var, ancak bu çözüm benim için çalışmıyor
Dexter

3
Kod kapsamı için eclemma kullanıyorsanız bu çözüm işe yaramayacaktır. Test edilen sınıfın @PrepareForTest'e eklenmesi, bu sınıf için% 0 kapsamla sonuçlanacaktır
ACV

2
Çözüm işe yarayacak - test doğru şekilde yürütülecektir. Açıkçası eclemma, PowerMockito ile başa çıkmak için donanımlı değil. Kod kapsamı bu sorunun bir parçası değildir.
TrueDub

5

@TrueDub'ın kabul ettiği yanıtta belirtildiği gibi, kurucunun çağrıldığı sınıfı eklemeniz gerekir @PrepareForTest.

Ancak, bunu yaparsanız, eclemma ve Sonar tarafından bildirilen o sınıf için kapsam o sınıf için sıfır olacaktır.

Powermockito wiki

Javassist'i ByteBuddy (# 727) ile değiştireceğiz ve bu eski sorunun çözülmesine yardımcı olacaktır. Ancak şu anda JaCoCo On-the-fly enstrümantasyon ile PowerMock'u KULLANMANIN YOLU YOKTUR. IDE'de kod kapsamı almak için hiçbir geçici çözüm yok.

Dolayısıyla buradaki çözüm, o sınıfın bir örneğini döndürecek ve ardından statik olarak alay edecek bir statik fabrika kullanmak için gerçek kodu yeniden düzenlemek olacaktır.


Yorumunuza katılıyorum.
Lathy

Yine de Intellij'de bu bir sorun değil.
ACV

Bunun yalnızca bu ek açıklamayı kullandığınız test sınıfını etkilediğine inanıyorum, bu nedenle etkiyi en aza indirmek için bu testleri izole edebilirsiniz. Sorunun gerçekten sınıfın test için düzgün yapılmamış olması olduğuna tamamen katılıyorum
Calabacin

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.