2012-01-31 31 views
32

Şu anda Mockito çerçevesini çalışıyorum ve Mockito kullanarak birkaç test vakası oluşturdum. Yapmam gereken tek şey @RunWith(MockitoJUnitRunner.class) ile benim test sınıfını açıklama ya @Before yöntemde MockitoAnnotations.initMocks(this); kullanmaktır - Ama sonra yerine mock (SomeClass .class) çağırma I @Mock ve @InjectMocks kullanabileceği okuyun.@Mock ve @InjectMocks kullanarak

Ama işe yaramıyor - @Mock çalışmıyor! İşte benim 2 kodları revizyonları - biri ek açıklamaları kullanarak ve bir olmadan.

Neyi yanlış yapıyorum?

public class ReportServiceImplTestMockito { 

    private TaskService  mockTaskService; // This is the Mock object 
    private ReportServiceImpl service; 

    @Before 
    public void init(){ 
     service   = new ReportServiceImpl(); 
     mockTaskService = mock(TaskServiceImpl.class); 
     service.setTaskServiceImpl(mockTaskService); 
    } 
/// ... 

Some tests 
} 

Dediğim gibi - bu iş harika. Ama şu alışkanlık:

@Service 
public class ReportServiceImpl implements ReportService { 

    @Autowired 
    private TaskService taskServiceImpl; 

    public ReportServiceImpl(){} 

    public ReportServiceImpl(TaskService taskService){ 
     this.taskServiceImpl = taskService; 
    } 

    public void setTaskServiceImpl(TaskService taskServiceImpl) { 
     this.taskServiceImpl = taskServiceImpl; 
    } 
} 

ben eksik: Burada

@RunWith(MockitoJUnitRunner.class) 
public class ReportServiceImplTestMockito { 

    @Mock 
    private TaskService  mockTaskService; 

    @InjectMocks 
    private ReportServiceImpl service; 

     // Some tests 
} 

Ve ReportServiceImpl sınıftır?

+0

İlk bakışta bana iyi görünüyor. Senin için tam olarak ne yanlış gidiyor? –

+1

@Noam Doğru ithalatı kullandığınızdan emin misiniz? – Brice

+0

David - Bir NullPointerException alıyorum. Ve Brice, doğru ithalatı kullandığımı düşünüyorum - işte burada 'import org.jmock.auto.Mock; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.MockitoAnnotations; import org.mockito.runners.MockitoJUnitRunner; ' – Noam

cevap

24

Tamam ibaresini, ben hatamı var !!! @InjectMocks'u kullandım ama aynı değişkeni init() yönteminde başlattım ... Peki, ne oldu? Mockito, sahte nesneleri benim değişkenime enjekte etti - ama saniye sonra onu çalıştırdım - bu çok değişken aynı! !!

3

emin değilim, ama (sen çalışma örneğinde olduğu gibi) elle ReportServiceImpl yeni örneği oluşturmaya çalışın:

@InjectMocks 
private ReportServiceImpl service = new ReportServiceImpl(); 
+3

Kenardan hariç, Mockito 1.9'dan beri bu artık gerekli değil. – Brice

+1

Eğer 1,8 kullanıyorsanız, 'MockitoAnnotations.initMocks (this)' seçeneğini kullanmıyorsanız, başlatıcı veya yapıcıda başlatmanız gerekir; bu durumda, çağrılmadan önce bunu başlatmanız gerekir. – jhericks

+3

İlk olarak, cevaplar için teşekkürler. ama MockitoAnnotations.initMocks (bu) kullanmak, @RunWith (MockitoJUnitRunner.class) kullanıldığından beri gerekli değildir. – Noam

12

Kodunuz Mockito 1.9 kullanarak benim için çalışıyor.

Mockito'nun 1.8+ bir sürümünü kullanarak, sorunun nasıl giderileceğini tam olarak belirten çok özel bir hata mesajı alıyorum. Php-coder'ın önerdiği gibi: Mockito 1.8+ için alanı başlatmanız gerekiyor.

Bu veya başka bir hata mesajı gördünüz mü?

Düzenleme:

Aşağıdaki kod benim için çalışıyor. Küçük değişiklikler:

  • kaldırıldı Bahar ek açıklamaları
  • Arayüz kaldırıldı
  • Eklendi Getter
  • sizin için bir hata oluşturur mu System.out.println

ile

  • eklendi boş TaskService
  • Eklendi testi? :

    Hizmeti:

    public class ReportServiceImpl { 
    
        private TaskService taskServiceImpl; 
    
    
        public ReportServiceImpl() { 
    
        } 
    
    
        public ReportServiceImpl(TaskService taskService) { 
         this.taskServiceImpl = taskService; 
        } 
    
    
        public void setTaskServiceImpl(TaskService taskServiceImpl) { 
         this.taskServiceImpl = taskServiceImpl; 
        } 
    
    
        public TaskService getTaskServiceImpl() { 
         return taskServiceImpl; 
        } 
    } 
    

    Bağımlılık:

    public class TaskService { 
    
    } 
    

    Testi, baskılar mockTaskService:

    @RunWith(MockitoJUnitRunner.class) 
    public class ReportServiceImplTestMockito { 
    
        @Mock 
        private TaskService  mockTaskService; 
    
        @InjectMocks 
        private ReportServiceImpl service; 
    
    
        @Test 
        public void testMockInjected() { 
         System.out.println(service.getTaskServiceImpl()); 
        } 
    } 
    
  • +0

    Merhaba, ben de Mockito 1.9 kullanıyorum ... – Noam

    +1

    Dediğim gibi, kod benim için çalışıyor. Gönderdiğim kodu test edebilir misiniz (sadece küçük değişiklikler)? –

    +0

    Merhaba Arend, gecikme için özür dilerim - ama kodunuz benim için de işe yarıyor, @Mock ek açıklaması için bir ithalatı kullandım - import org.mockito.MockitoAnnotations; import org.mockito.Mock yerine; – Noam