2012-04-04 28 views
5

Test edilen sınıfta özel parametrelerden biri olan (setter olmadan) sahte oluşturmak için EasyMock kullanıyorum. Yansımayı kullanmayı denedim - ancak doğru çalışmıyor.Test edilmiş sınıftaki özel alana EasyMock alayının nasıl enjekte edilmesi

public class TestedClassTest{ 
    @Test 
    public void test(){ 
     TestedClass instance = new TestedClass(); 
     MockedClass mocked = EasyMock.createMock(MockedClass.class); 
     Data data = new Data(); 

     //Void setter 
     DataType dataType = (myDataType.DataType) EasyMock.anyObject(); 
     mocked.setDataType(dataType); 
     EasyMock.expectLastCall(); 

     //expect 
     EasyMock.expect(mocked.getData()).andReturn(data); 
     EasyMock.replay(mocked); 

     Field field = instance.getClass().getDeclaredField("mockedClass") 
     field.setAccessible(true); 
     field.set(instance, mocked); 

     //run tested method 
     instance.someAction(); 

     EasyMock.verify(mocked); 
    } 
} 

Im BAŞARISIZ alma bilgi:

Unexpected method call MockedClass.setDataType([email protected]): 
MockedClass.getData(): expected: 1, actual: 0 
junit.framework.AssertionFailedError: 
Unexpected method call MockedClass.setDataType([email protected]): 
MockedClass.getData(): expected: 1, actual: 0 

bu yöntem test "instance.someAction()" sırasında "MockedClass" nesne üzerinde ateşlenir emin Im

nasıl bu sorunu çözmek için?

Düzenlendi - Cevap: replay.mocked() katına düzelttikten sonra ben (! Kadar basit) bir daha boşluk yöntem EasyMock.expectLastCall()

cevap

3

Kişisel yansıma kodu kullanılarak deklare edilmesi gerektiğini gayet iyi görünüyor bulundu.

EasyMock'i ​​kullandığımdan bu yana çok uzun zaman geçti, ancak bir testte sadece bir kez çağrılması gereken replay değil mi? İki kere çağırıyorsun. İlk replay aramasından kurtulmayı deneyin.

Bu durumda, aldatmacayı içeren alanın herkese açık olması mantıklı mıdır? Genel olarak, işbirlikçiler ya bir kurucu ya da ayarlayıcı ile belirlenmeli ve yansıma ihtiyacını ortadan kaldırmalıdır.

DÜZENLEME - güncellemelerinize dayanarak - hatanın alayda setDataType çağrıldığını, ancak sahte aygıtın çağrılmasını beklemediğini belirtir. Belki de sınıfınız iki kez çağırıyordur, belki de sırayla çağrılıyor ya da beklemediğiniz bir argümanla çağırıyor (bu durumda hatanın farklı olmasını beklesem de).

+0

Bu sorunu çözdüğünüzde ve hala benzer bir sorun yaşıyorsanız – Marcin

+0

hatanın aynı olduğundan emin misiniz? – hvgotcodes

+0

düzenlenmiş kod ve hata, thx! – Marcin