2011-02-10 17 views
11

Bu test:Bir sınıf alır yapıcı ile nesne alay etmek nasıl?

Bunlar

public class ClassUnderTesting { 

    public void methodUnderTesting() { 
     new CollaboratorToBeMocked(InjectedAsTypeIntoCollaborator.class); 
    } 

} 

public class CollaboratorToBeMocked { 

    public CollaboratorToBeMocked(Class<InjectedAsTypeIntoCollaborator> clazz) { 
    } 

    public CollaboratorToBeMocked(InjectedIntoCollaborator someCollaborator) { 
    } 

    public CollaboratorToBeMocked() { 
    } 

} 

public class InjectedAsTypeIntoCollaborator { 

} 

public class InjectedIntoCollaborator { 

} 

Bu hata:

org.powermock.reflect.exceptions.TooManyConstructorsFoundException: Several matching constructors found, please specify the argument parameter types so that PowerMock can determine which method you're refering to. 
Matching constructors in class CollaboratorToBeMocked were: 
CollaboratorToBeMocked(InjectedIntoCollaborator.class) 
CollaboratorToBeMocked(java.lang.Class.class) 

Burada soru geliyor: PowerMock figürünü nasıl yapabilirim Hangi kurucu aramaya?

Sorunlu satırsuppress. Hatanın nereden geldiğini budur.

+1

CollaboratorToBeMocked (java.lang.Class.class) yapıcısını kaldırdığınızda ne olur? O zaman işe yarıyor mu? – Davidann

+0

Yani, diğer yapıcıyı kaldırdığımda ... evet, InjectedIntoCollaborator ile kurucuyu kaldırırsam, – Belun

cevap

2

Sorunuzu yazana kadar PowerMock'u bilmiyordum, ama biraz okuma yaptım ve belgelerinde bulamadım. Hala o size yardımcı olur gerçekten emin değilim:

süper sınıf birkaç kurucular varsa yalnızca belirli bir birini bastırmak için PowerMock söylemek mümkündür. Diyelim ki bir String alır bir Oluşturucu sahip ClassWithSeveralConstructors adında bir sınıf ve bağımsız değişken olarak bir int alır başka kurucuya sahip ve yalnızca dize yapıcısı bastırmak için istediğinizi varsayalım. Bunu, suppress(constructor(ClassWithSeveralConstructors.class, String.class)); yöntemini kullanarak yapabilirsiniz. Eğer istediği şey

http://code.google.com/p/powermock/wiki/SuppressUnwantedBehavior

bulunan değil midir?

DÜZENLEME: Şimdi anlıyorum, zaten bastırmayı denediniz. Ama bastıran çağrıyı aldığına emin misin? constructor()'un ilk argümanı, kurucunun içinde basmak istediğin sınıf olması değil mi?

+0

çalışıyorsunuz. benim süpermen bir karmaşa. yine de, ben hala çalışmıyor (bastırıcı (CollaboratorToBeMocked.class, InjectedIntoCollaborator.class)); ' – Belun

+0

um, benim test kötü. Test sınıfını bir kez düzelttikten sonra test yeşile döndü. Yani, sorun şu anda, süperiyor. bir hata olabilir ... – Belun

+0

Tam bir örneğiniz varsa ve beklenen sonucu hala göremiyorsanız, kesinlikle projeye bir hata raporu vermeliyim. –

17

Belki de sorunuz için çok geç. Bugün tanıştım ve çözümü şu url'de buldum. Temel olarak, argüman türünüzü belirtmeniz gerekir.

http://groups.google.com/group/powermock/msg/347f6ef1fb34d946?pli=1

whenNew(MimeMessage.class).**withParameterTypes(MyParameterType.class)**.withArguments(isA(MyParameter.class)).thenReturn(mimeMessageMock); 

o size yardımcı olabilir umuyoruz. :)

+1

Bu cevap benim için çalıştı. Jenerik T'ye sahip ResponseEntity sınıfı ile bir durum vardı. kamu ResponseEntity (MultiValueMap başlıkları, httpStatus statusCode) kamu ResponseEntity (T vücut, httpStatus statusCode) sözdizimi kullanıyorsanız: PowerMockito.whenNew (ResponseEntity.class) .withArguments (başlıklarını, statusCode). thenReturn (responseEntity); Çalışmazsa ancak PowerMockito.whenNew (ResponseEntity.class) .withParameterTypes (MultiValueMap.class, HttpStatus.class) .withArguments (başlıklar, statusCode) .thenReturn (responseEntity); – gaoagong