2011-02-06 38 views
10

Böyle bir sınıf var. toString() yöntemini sınamak için bir deneme testi yazmak istiyorum. Bunun için getBar() yöntemini alayım ve sonra çıkışı kontrol etmek için orijinal toString() yöntemini çalıştırmam gerekir.Test kodu

İlk düşüncem bu imkansız olmalıydı, ancak özellik listesine göre son sınıfları ve yerel yöntemleri test eden PowerMock'u buldum. Ama şimdiye kadar bununla hiçbir başarı elde edemedim. Yönetilen en iyi şey, tüm sınıfı alay etmekti, ancak daha sonra test, çok anlamlı olmayan gerçek olan yerine toString() yöntemini test etti.

Peki, bu toString() yöntemini yukarıdan test etmek için PowerMock'i ​​nasıl kullanabilirim? PowerMock'i ​​Mockito ile kullanmayı tercih ediyorum ancak bu mümkün değilse, EasyMock'u kullanmakta sorun yaşamadım.

cevap

8

Bulunamadı. Yaptığım yol doğruydu. Kaçırdığım tek şey, tost nesnesine toString çağrıldığında orijinal yöntemi çağırmaktı. Yani bu gibi çalışır:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ Foo.class }) 
public class FooTest 
{ 
    @Test 
    public void testToString() throws Exception 
    { 
     Foo foo = mock(Foo.class); 
     when(foo.getBar()).thenReturn(42); 
     when(foo.toString()).thenCallRealMethod(); 
     assertEquals("Bar: 42", foo.toString()); 
    } 
} 
+1

HI ... ben eklemek olamaz "zaman()" .. neden ..? Lütfen bana Easymock –

1

Veya kullanmak Strateji Desen: birim test, sahte IBarStrategy örneğini enjekte zaman, o zaman sınıf Foo test edebilir

public final class Foo 
    { 
     public IBarStrategy barStrategy; 

     ...... 
    } 

    interface IBarStrategy{ 
     int getBar(); 
    } 

.

+3

'u kullandığını söyler misiniz? Bağımlılık enjeksiyonu, kodun yeniden kullanımı ve modülerliği için güzel bir şeydir, ancak eğer gerekli değilse, neden karmaşıklığı artırmalı ve sınıflarımın sadece test edilebilirliğini azaltmak için neden gevşemeliyim? Ama buradaki nokta bu değil. Öyleyse test konusunu değiştiremediğimi diyelim, böylece yerel yöntemleri bir arayüze çıkaramıyorum. – kayahr

+0

aslında bunu yaparak karmaşıklığı arttırmıyorsunuz. Bunu yapamayarak sadece karmaşıklığı gizleme. başlamak için test edilebilirlik için tasarlamalısınız – Will

3

Veya Kısmi dinamik ile JMockit kullanmak alay:

import org.junit.*; 
import mockit.*; 

public class FooTest 
{ 
    @Test 
    public void testToString() 
    { 
     final Foo foo = new Foo(); 
     new Expectations(foo) {{ foo.getBar(); result = 42; }}; 

     assertEquals("Bar: 42", foo.toString()); 
    } 
}