2013-04-11 21 views
18

Enum singleton sınıfıyla nasıl başa çıkılacağından emin değilim.Enum singleton sınıfını Mockito/Powermock kullanarak nasıl alay edebilirsiniz?

public enum SingletonObject{ 
    INSTANCE; 
    private int num; 

    protected setNum(int num) { 
    this.num = num; 
    } 

    public int getNum() { 
    return num; 
    } 

Yukarıdaki örnekte() getNum saplama istiyorum ama gerçek SingletonObject sınıfı alay anlamaya olamaz. Enums'lar doğal olarak final olduğundan, testin hazırlanmasına yardımcı olmak için Powermock'u kullanmayı düşündüm.

//... rest of test code 
@Test 
public void test() { 
    PowerMockito.mock(SingletonObject.class); 
    when(SingletonObject.INSTANCE.getNum()).thenReturn(1); //does not work 
} 

Bu, PowerMockMockito 1.4.10 ve Mockito 1.8.5 kullanıyor.

+0

Benzer bir konuya bakın: http://stackoverflow.com/questions/2302179/mocking-a-singleton-class –

+0

Teşekkürler Martin, ben bu konudan okudum ve enum olmayan yolunu kullanmayla ilgili bir yaklaşım gibi görünüyor. tek birtonu uygulamak ve bu yöntemle alay etmek için kullanabiliyorum. Bununla birlikte, bir enum singleton sınıfıyla dalga geçmenin bir yolu var mı? Topladığımdan, enum singleton sınıfı, java 1.5 sonrası bir singleton bildirmek için önerilen yöntemdir. –

+0

[Re: PowerMock: ener alay edebilir miyim?] (Https://groups.google.com/forum/?fromgroups=#!topic/powermock/hqrJaMi0Zrc) – Joe

cevap

23

INSTANCE öğesinin ne geri döndüğünü öğrenmek istiyorsanız, bunu yapabilirsiniz (ancak yansıma & bytecode manipulation kullanarak). Ben & yarattım PowerMock 1.4.12/Mockito 1.9.0 kullanarak üç sınıf ile basit bir proje test. Tüm sınıflar aynı pakette idi.

SingletonObject.java

public enum SingletonObject { 
    INSTANCE; 
    private int num; 

    protected void setNum(int num) { 
     this.num = num; 
    } 

    public int getNum() { 
     return num; 
    } 
} 

SingletonConsumer.java

public class SingletonConsumer { 
    public String consumeSingletonObject() { 
     return String.valueOf(SingletonObject.INSTANCE.getNum()); 
    } 
} 

Whitebox.setInternalState çağrısı Eğer içinde manipüle edebilir sahte nesne ile INSTANCE değiştirir

import static org.junit.Assert.*; 
import static org.powermock.api.mockito.PowerMockito.*; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 
import org.powermock.reflect.Whitebox; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest({SingletonObject.class}) 
public class SingletonConsumerTest { 
    @Test 
    public void testConsumeSingletonObject() throws Exception { 
     SingletonObject mockInstance = mock(SingletonObject.class); 
     Whitebox.setInternalState(SingletonObject.class, "INSTANCE", mockInstance); 

     when(mockInstance.getNum()).thenReturn(42); 

     assertEquals("42", new SingletonConsumer().consumeSingletonObject()); 
    } 
} 

SingletonConsumerTest.java sınavın

+1

Ama nasıl SingletonObject ile alay edebilirsiniz. sınıf? – Thamiar

+1

Bu PowerMock kullanır: Bu yorum ile MockitoException verecek "- son sınıflara - - anonim sınıflar ilkel tipleri mockito aşağıdaki/casus alay edemez". –

+0

Merhaba, 'java.lang.IllegalAccessException var: Whitebox.setInternalState' kullanırken statik finali ayarlanamıyor. Neden biliyor musun? – elsennov

İlgili konular