2012-11-30 19 views
8

Bir yöntemi sınama yaparken taklit etmek istediğim bir dao.create() aramam var. Ama hala NPE alıyorum gibi bir şey eksik. Burada sorun nedir?Özel bir dao değişkeni nasıl alay edilir?

class MyService { 
    @Inject 
    private Dao dao; 

    public void myMethod() { 
     //.. 
     dao.create(object); 
     // 
    } 
} 
Ben dao.create dışarı taklit Nasıl() call

?

@RunWith(PowerMockRunner.class) 
@PrepareForTest(DAO.class) 
public void MyServiceTest { 

    @Test 
    public void testMyMethod() { 
     PowerMockito.mock(DAO.class); 

     MyService service = new MyService(); 
     service.myMethod(); //NPE for dao.create() 
    } 
} 
+0

"DAO" veya "Dao" sınıfı mı? – fgb

+0

Bazı iyi çözümler, kullanmakta olduğunuz bağımlılık enjeksiyon çerçevesine bağlıdır. Lütfen uygun bir etiket ekleyin (guice, spring, ...) –

cevap

5

DAO'yu enjekte etmiyorsunuz. Mockito ile test sınıfınızı @InjectMocks kullanmak ve mockito runner kullanmak için değiştirebilirsiniz.

@RunWith(MockitoJUnitRunner.class) 
public void MyServiceTest { 
    @Mock 
    private Dao dao; 
    @InjectMocks 
    private MyService myService; 
    ... 
} 

Sen Inject Mocks API

basit bir şekilde en InjectMocks hakkında daha fazla bilgi bulabilirsiniz kurucu tarafından enjeksiyon için enjeksiyon değişiyor. Örneğin,

class MyService { 
    ... 
    private final Dao dao; 

    @Inject 
    public MyService(Dao dao) { 
     this.dao = dao; 
    } 
    ... 
} 

sonra teste MyService değiştirecek yapabildin basit pas kurulumunda alay DAO. testleri oluştururken diğer geliştiricilere bağımlılıklar net sağlayacak yapıcı tarafından enjeksiyonu kullanılarak

... 
    verify(dao).create(argThat(isExpectedObjectBeingCreated(object))); 
} 

private Matcher<?> isExpectedObjectBeingCreated(Object object) { ... } 

ve yardımcı olacaktır :)

: şimdi

... 
@Mock 
private Dao dao; 

@Before 
public void setUp() { 
    this.dao = mock(Dao.class); 
    this.service = new MyService(dao); 
} 
... 

Eğer create denilen olsaydı mesela, kontrol etmek verify kullanabilirsiniz

+0

Kötü ingilizce için özür dilerim: P –

+1

ingilizce o kadar da kötü değil ve bana çok yardımcı oluyor. Teşekkürler! – membersound

1

Hala taklidinin ile dao alanını ayarlamak gerekir. Bunun yansımasını kullanabilirsiniz.

1

Hizmet sınıfınızda alay edilen nesne DAO'sunu enjekte etmeniz/ayarlamanız gerekir. Bir yay tabanlı proje ise, Dao enjekte asla new MyService() kullanırsanız

, Bahar JUnit Testrunner

0

@ bir göz olabilir. Dao'nun enjekte edilmesi için MyService'i bir ApplicationContext (Spring) veya bir Injector (Guice) üzerinden yüklemeniz gerekir. Normal uygulamanızda olduğu gibi.

0

Diğerleri de söyledikleri gibi, dao alanını MyService sınıfınızda bir şekilde ayarlamanız gerekir. Testinizdeki bir bileşik koşucunun Powermock ve bir DI framework runner'ı (Powermock'un gerekli olduğu varsayılarak) kullanmasına izin vermekten emin değilim, fakat PowerMock'ı kullandığınız sürece (verilen örnekte net olmayan nedenlerden dolayı) Daha da manuel olarak ayarlamak için Whitebox sınıfından faydalanabilirsiniz.

public void testMyMethod() { 
    Dao dao = mock(Dao.class) 
    doNothing().when(dao).create(anyObject())); //assuming no return val for dao.create() 

    MyService service = new MyService(); 
    Whitebox.setInternalState(service, "dao", dao); 

    service.myMethod(); 
} 
İlgili konular