2016-03-20 30 views
0

ile parametreli ve parametreli arama yapıcıyı çağırıyorum PowerMockito'nun nasıl çalıştığını anlamaya çalışıyorum.PowerMockito

Test etmeye çalıştığım şey, aynı sınıfın iki yöntemini ve aynı zamanda bir final dersi olan bir joda DateTime sınıfında bir yöntem denen bir yöntemdir, bu yüzden alay etmek imkansızdır Mockito ile. Bu yüzden (araştırma saatlerinden sonra) Powermockito kullanıyorum. Ben @RunWith(PowerMockRunner.class) ve @PrepareForTest iki sınıf (bir test edilmekte ve joda.time.DateTime) ve benim setUp() kullanıyorum

Bu kod dört satır soruşturmanın saat temsil bu

target = new ClassToBeTested(); 
DateTime TODAY = new DateTime(2016, 8, 6, 0, 0, 0, 0); 
PowerMockito.whenNew(DateTime.class).withNoArguments().thenReturn(TODAY); 

test benzer ve hatalar, ama çalıştılar: test etmek zorunda olduğum 'hedef' yönteminde, argümanları olmayan bir DateTime nesnesi oluşturduğumda, geçerli günü öğrenmek için kullanabilirdim, TODAY nesnesini döndürür. Sorun şu ki, bu yöntemin içinde, başka bir çift DateTime Nesnesi oluşturmalı ve bunları farklı tarihlerle başlatmalıyım (yöntemin mantığı, bu iki tarihi geçerli günle karşılaştırmayı ve eylemleri gerçekleştirmeyi gerektirir), yani çözelti

DateTime TODAY = new DateTime(2017, 8, 17, 0, 0, 0, 0); 
DateTime createdOn = new DateTime(2016, 7, 6, 10, 0, 0, 0); 
DateTime recordedOn = new DateTime(2016, 7, 7, 12, 20, 0, 0); 
PowerMockito.whenNew(DateTime.class).withNoArguments().thenReturn(TODAY); 
PowerMockito.whenNew(DateTime.class).withAnyArguments().thenReturn(createdOn, recordedOn); 

olabileceğini düşündük Ama çalıştığımızda, o zaman doğru createdOn ve recordedOn hiçbir parametrelerle DateTime yapıcısındaki createdOn yerine TODAY aldı ve. Satır withAnyArguments daha net yapmaya çalıştığım şey göstermek için withNoArguments

geçersiz ise, bu yöntem test edilecek görünüyor gibi nasıl Sanki (sadece önemli bir parçası)

DateTime today = new DateTime(); //To know current day, I was hoping that the withNoArgument take care of this returning TODAY. But it really received createdOn   
DateTime createdOnDay = new DateTime(this.getDateCreated()); it received , createdOnd  
DateTime recordedOnDay = new DateTime(this.getDateRecorded()); 
// It received recordedOn. 

Can birisi noktası bana ne yapıyorum yanlış?

Selamlar

+0

Muhtemelen herhangi bir argümanın argüman olmadığı için geçerli olması muhtemeldir (hiçbir şeyin hiçbir şey olmadığını varsayalım). Muhtemelen 'withArgument (Date.class)' kullanarak veya böyle bir şey kullanarak alabilirsiniz. –

+0

Teşekkürler. Denedim ama ne yazık ki işe yaramıyor. withArgument bir "nesne türü" veya bir şey değil, belirli bir değer alır. – Nisanio

+0

** @PrepareForTest'e ** ClassToBeTested ** eklediniz. 'DateTime' yapıcısını kullanan sınıfın da ek açıklamalara eklenmesi gerektiği anlamına gelir. –

cevap

0

Yan açıklama: Bu her zaman kodu test altında test izin vermek yerine mümkünse refactor, PowerMockito "mockNew" kullanmak son derece cesareti var. Bununla


:

Foo:

package so36119627; 

public class Foo { 

    private final String bar; 

    public Foo(String bar) { 
     this.bar = bar; 
    } 

    public Foo() { 
     this("hello"); 
    } 

    public String getBar() { 
     return bar; 
    } 
} 

Bar: Aşağıdaki test ve ince çalışır

package so36119627; 

public class Bar { 
    public String bar() { 
     return new Foo().getBar() + "/" + new Foo("world").getBar(); 
    } 
} 

wh yapmak istediğiniz zaman:

package so36119627; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Matchers; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

import static org.junit.Assert.assertEquals; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest({Foo.class, Bar.class}) 
public class BarTest { 
    @Test 
    public void test1() throws Exception { 
     assertEquals("hello/world", new Bar().bar()); 
    } 

    @Test 
    public void test2() throws Exception { 
     // do not inline foo1 and foo2, because of powermock 
     final Foo foo1 = new Foo("with arg"); 
     final Foo foo2 = new Foo("no arg"); 
     PowerMockito.whenNew(Foo.class).withArguments(Matchers.anyString()).thenReturn(foo1); 
     PowerMockito.whenNew(Foo.class).withNoArguments().thenReturn(foo2); 

     assertEquals("no arg/with arg", new Bar().bar()); 
    } 
} 
+0

yaptım. Çok iyi bir fikir değil, kod çözümleme testleri tamamlandı. –