2011-03-12 28 views
11

PowerMock'u mockito ile çalışmaya çalışıyorum ve şu belgeyi izliyorum: http://code.google.com/p/powermock/wiki/MockitoUsage13.PowerMock, mockito, statik yöntemi doğrulayın

biraz basitleştirmek için, ben statik bir yöntem olduğunu söylemek sağlar: Test edilecek

StaticObj.put(String key, String val) { ... } 

Ve sınıfını yapar böyle bir şey: Ben istiyorum benim birim testinde

public class ClassToTest { 
    public void doSomething(Params p) { 
     if (StringUtils.isNotBlank(p.getK()) StaticObj.put("k1", p.getK()); 
     if (StringUtils.isNotBlank(p.getX()) StaticObj.put("x1", p.getX()); 
    } 
} 

onlar boş veya boş değilken StaticObj.put K ve X için çağrılır doğrulamak ister, bu yüzden böyle bir şey yapmak:

public void testNormalCase() { 
    // assume that mocking setup for statics already happened in some @Before function.. 
    Params params = new Params("k", "x"); 
    ClassToTest classToTest = new ClassToTest(); 
    classToTest.doSomething(params); 

    // now I want to verify: 
    PowerMockito.verifyStatic(times(1)); 
    StaticObj.put("k1", "k1"); 

    PowerMockito.verifyStatic(times(1)); 
    StaticObj.put("x1", "x"); 
} 

Bu çalışıyor ve beklediğim şey bu. Ne işe yaramazsa, K için doğrulamayı açıklarsam, X'in doğrulanması başarısız olur! Hata mesajı ("x1", "x") beklenen ancak ("k1", "k") olduğunu gösterir. Bu neden? Bunu doğru olarak kodlamıyorum?

public void testOtherCase() { 
    // assume that mocking setup for statics already happened in some @Before function.. 
    Params params = new Params("k", null); 
    ClassToTest classToTest = new ClassToTest(); 
    classToTest.doSomething(); 

    // now I want to verify: 

    PowerMockito.verifyStatic(never()); 
    StaticObj.put(eq("x1"), anyString()); 
} 

Ör:

Ayrıca geçer testin, türünün şu yanlış tamamen nedenle geçmesi olabileceğini beni inandıramaz Powermock'un "k1" görüp görmediğini merak ediyorum, "x1" kelimesinin asla çağrılmadığına ve geçtiğine karar verir. (?)

Genel olarak belirtmek gerekirse, N kere çağrılan statik bir yöntem kullanıyorum (N giriş parazitlerine bağlı olarak değişir). Ve doğru durumlarda çağrıldığını doğrulamak istiyorum (giriş paramları ile belirlenebilir). Yanlış anlayamadığım sürece powermock'ın bu kadar iyi işlemediği görülüyor.

Herhangi bir fikir için teşekkürler!

+2

Aslında bir sorunla ilgili olabileceğini düşündüğüm bir sorunla karşılaştım. http://code.google.com/p/powermock/issues/detail?id=342 –

cevap

6

Bu soruyu ve konuyu dikkatlice okudum, ancak bunları açık bir şekilde anladığımdan emin değilim - Anladığım kadarıyla, k ve x'i geçerken powermock'un istisnayı kaldırması doğrudur, ancak yalnızca k'i doğrulayın. Statik yöntem StaticObj.put alay Çünkü

, parametre k ve x geçmek ve

PowerMockito.verifyStatic(times(1)); 
StaticObj.put("k1", "k1"); 

PowerMockito.verifyStatic(times(1)); 
StaticObj.put("x1", "x"); 

ile bunu doğrulamak, bu çalışması gerekir. Ve k parametresinin doğrulaması için k parametresinin doğrulandığını kontrol ettiğinizde, k ifadesi yorumlanır.

// PowerMockito.verifyStatic(times(1)); 
// StaticObj.put("k1", "k1"); 

PowerMockito.verifyStatic(times(1)); 
StaticObj.put("x1", "x"); 

Powermock koymak ("k1" ...) görünüşte ilk ile çağırmayı alacak, bu yüzden x doğrulama bir hata yükseltecektir. Doğrulama işleminiz sıralanıyor.

İlgili konular