2013-11-21 18 views
8

Sadece basit bir test vakası çalıştırmaya çalışıyorum. Aşağıdaki yönteme sahibim.Powermock (With Easymock) Kullanışlı birimde son çağrı yok

public static void run(String[] args) throws Throwable { 
    CommandLineArguments opts = CommandLineOptionProcessor.getOpts(args); 
} 

Gittiğimde bu yöntemi/test vakasını oluşturmaya devam edeceğim. Ancak sadece basit bir test vakasının önce çalıştığından emin olmak istedim. Ben de şu testi yazdım.

@Test 
public void testRun() { 
    String[] args = {"--arg1", "value", "--arg2", "value2"}; 

    mockStatic(CommandLineOptionProcessor.class); 
    expect(CommandLineOptionProcessor.getOpts(args)); 

    EasyMock.replay(CommandLineOptionProcessor.class); 
} 

Bundan sonra aşağıdaki hatayı alıyorum:

java.lang.IllegalStateException: no last call on a mock available 

Ben StackOverflow'daki diğer bazı mesajlar okumak ama onların çözüm onlar Mockito ile PowerMock kullandığını gibi görünüyordu. Ben Powermock ve Easymock kullanıyorum, bu yüzden sorun olmamalı.

Rene'nin tavsiyelerini takip ettim ve dersimi ekledim.

@PrepareForTest(CommandLineOptionProcessor.class) 
@RunWith(PowerMockRunner.class) 
public class DataAssemblerTest { 

Önceki hatayı düzelttim. Ama şimdi bu hatayı aldım.

java.lang.IllegalArgumentException: Not a mock: java.lang.Class 
at org.easymock.internal.ClassExtensionHelper.getControl(ClassExtensionHelper.java:61) 
at org.easymock.EasyMock.getControl(EasyMock.java:2172) 
at org.easymock.EasyMock.replay(EasyMock.java:2074) 
. 
. 
. 

Bunun neden olabileceği konusunda herhangi bir fikir harika olurdu.

+0

Eğer maven kullanıyor musunuz:

expect(CommandLineOptionProcessor.getOpts(args)).andReturn(object); 

de size bu sınıf test ekleyin? –

+0

Hayır. Şu anda Maven kullanmıyorum. –

+0

@ RenéLink Sorunu JavaAssist ile düzelttim. Çıktı, projede kütüphaneye henüz sahip değildim. Yani bu şimdi iyi. Ancak, şimdi 'alay değil' yazan bu yeni sorun var. –

cevap

16

Test sınıfını @RunWith(PowerMockRunner.class) ve @PrepareForTest(CommandLineOptionProcessor.class) ile eklediniz mi?

@RunWith(PowerMockRunner.class) 
@PrepareForTest(CommandLineOptionProcessor.class) 
public class TestClass { 

    @Test 
    public void testRun(){ 

Test sınıfı düzeyinde @PrepareForTest(CommandLineOptionProcessor.class)'a ihtiyacınız var.

Use the @PrepareForTest(ClassThatContainsStaticMethod.class) annotation at the class-level of the test case.

Ayrıca gerekli kütüphaneleri testi üzerinde sınıf olmasını sağlamak: Powermock doc bakınız.

Sizin durumda javassist kitaplığı eksik. Onu sınıf yoluna koy. Belki başka bazı kütüphaneler de kayıp ... göreceğiz.

Eğer EasyMock.replay() kullandığınız

sonra
java.lang.IllegalArgumentException: Not a mock: java.lang.Class 

almak, ancak PowerMock.replay()

+0

Tamam. @PrepareForTest'i denedim, ancak bunu yöntem düzeyinde yapmıştım. @PrepareForTest (CommandLineOptionProcessor.class) ve @RunWith (PowerMockRunner.class) sınıf seviyesine geldiğimde yeni bir hata alıyorum. Orijinal Yazımımı hatayla düzenleyeceğim. –

+1

Evet, bunu da buldum. Testim için bir değişiklik daha yapmam gerekiyordu (ama bu sadece testim başarısız oldu). Şimdi harika çalışıyor. Tüm yardım ve Statik bir yöntem w/Powermock alay yolu için teşekkürler. Def. Yeni olduğunuzda biraz kafa karıştırıcı. –

0
EasyMock.expectLastCall() 

veya

EasyMock.expectLastCall().anyTimes() 

veya

EasyMock.expectLastCall().andAnswer(..) 
0 kullanmanız gerekiyorsa

kodunuzda mevcut değil, test etmek istediğiniz yöntemden sonra test yönteminizin geçersiz bir yöntem olması şarttır.

aksi takdirde kullanabilirsiniz:

@ObjectFactory 
public IObjectFactory getObjectFactory() { 

    return new org.powermock.modules.testng.PowerMockObjectFactory(); 
} 
+0

Bunu test sınıfına ekleme ne yapar? –

+1

Bir sorunum vardı - statik sınıflarla dalga geçmeye çalışırken bir istisna oldu ve bu bana yardımcı oldu. –

İlgili konular