Java için en iyi sahte çerçeve nedir? [kapalı]


347

Java'da sahte nesneler oluşturmak için en iyi çerçeve hangisidir? Neden? Her çerçevenin artıları ve eksileri nelerdir?

Yanıtlar:


315

Mockito'yu kullanırken başarılı oldum .

JMock ve EasyMock'u öğrenmeyi denediğimde, öğrenme eğrisinin biraz dik olduğunu fark ettim (belki de bu sadece benim).

Mockito'yu basit ve temiz sözdizimi sayesinde çok çabuk kavrayabildiğim için seviyorum. Minimal sözdizimi, yaygın vakaları çok iyi desteklemek için tasarlanmıştır, ancak birkaç kez daha karmaşık bir şey yapmak zorunda kaldım, istediğim şeyi destekledim ve kavramak kolay buldum.

İşte Mockito ana sayfasından (kısaltılmış) bir örnek:

import static org.mockito.Mockito.*;

List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();

Bundan daha basit olamaz.

Düşünebildiğim tek büyük dezavantajı, statik yöntemlerle alay etmeyecek olmasıdır.


15
Güzel. Statik yöntemler için, Mockito'yu JMockit ile birleştirin ve test edebilmeniz için hemen hemen hiçbir sınıf "miras" yoktur.
Epaga

6
Yapmamanız gereken bir şeyi yapmaya çalıştığınızda (örneğin, alayları satır içinde oluştur), istisna mesajında ​​neyi yanlış yaptığınıza dair çok net bir açıklama elde etmeyi seviyorum.
ripper234

3
Benim için, kesinlikle. Hala koşulsuz tavsiye ederim. Elbette, ihtiyaçlarınızı daha iyi karşılayan başka bir çerçeve bulursanız, başka bir cevapta bahsedin ve hangi oyları aldığını ve ne tür yorumlar aldığını görün.
Brian Laframboise

2
@MexicanHacker neden Android için kullanamıyorsunuz? Şu anda Robolectric ile kullanıyorum.
İlkka

2
Mockito kullanıyorum ve çok seviyorum !! Büyük bir belge de (bu kalitenin belgelerini bulmak için çok nadir, yazarlardan iyi bir iş), bu da çerçevenin kodunu kazmak zorunda kalmadan bir şeyler kullanmamız için çok önemli!
Renato

84

PowerMock'un yaratıcısıyım, bu yüzden bunu tavsiye etmeliyim! :-)

PowerMock , hem EasyMock hem de Mockito'yu statik yöntemler , son ve hatta özel yöntemler ile alay etme yeteneği ile genişletir . EasyMock desteği tamamlandı, ancak Mockito eklentisinin biraz daha çalışması gerekiyor. JMock desteğini de eklemeyi planlıyoruz.

PowerMock, diğer çerçeveleri değiştirmek için tasarlanmamıştır, bunun yerine diğer çerçevelerin alay etmesine izin vermediği zorlu durumlarda kullanılabilir. PowerMock ayrıca statik başlatıcıları ve yapıcıları baskılamak gibi diğer kullanışlı özellikleri de içerir .


Powermock, ana bilgisayarda yerel Java kullanan Android uygulamalarını birim test etmek için gereklidir (yavaş öykünücüyü kullanmaktan kaçınmak)
Jeff Axelrod

@Jan tek sorun PowerMock Robolectric kullanırken uyumsuz olsa da :-( @RunWith (PowerMockRunner.class) VE @RunWith (RobolectricTestRunner.class)
Blundell

Son birkaç aydır PowerMock'u kullandıktan sonra yürekten tavsiye ederim!
cwash

PowerMock gerçekten harika. Statik tektonları her şeye erişmeyi gerçekten çok seviyorum ve bu bunu test etmeyi mümkün kılıyor.
Ian Macalinao

Uyarı: son yöntemleri alay etme gibi bazı şeyler Mockito için değil, sadece EasyMock için Powermock'ta mümkündür. Bu kadar sık ​​kullanmadığınızda biraz yakaladım. Bir şeyin neden işe yaramadığını merak ediyordum, sonra sadece doco'nun Easymock bölümünde listelendiğini fark ettim.
trafalmadorian

46

JMockit proje sitesi akım alaycı araci karşılaştırmalı pek çok bilgi içeriyor.

Özellikle, EasyMock, jMock, Mockito, Unitils Mock, PowerMock ve elbette JMockit'i kapsayan özellik karşılaştırma matrisine göz atın. Mümkün olduğunca doğru ve güncel tutmaya çalışıyorum.


1
JMockit'ten çok etkilendim, daha dik bir öğrenme eğrisi var, ancak yıllarca çok iyi belgelere sahip ve her şeyi alay edebilir. Öğrenmesi kolay Mockito ile başladım, ancak düzenli olarak çözemediğim sorunlarla karşılaştım. Öte yandan JMockit ile neyin imkansız olduğunu hayal bile edemiyorum.
Hontvári Levente

21

JMockit ile başarılı oldum .

Oldukça yeni ve bu yüzden biraz ham ve belgelenmemiş. Sınıf bayt kodunu dinamik olarak yeniden tanımlamak için ASM kullanır , böylece statik, özel, yapıcılar ve statik başlatıcılar dahil tüm yöntemleri alay edebilir. Örneğin:

import mockit.Mockit;

...
Mockit.redefineMethods(MyClassWithStaticInit.class,
                       MyReplacementClass.class);
...
class MyReplacementClass {
  public void $init() {...} // replace default constructor
  public static void $clinit{...} // replace static initializer
  public static void myStatic{...} // replace static method
  // etc...
}

Kayıt / oynatma senaryolarına da izin veren bir Beklentiler arayüzü vardır:

import mockit.Expectations;
import org.testng.annotations.Test;

public class ExpecationsTest {
  private MyClass obj;

  @Test
  public void testFoo() {
    new Expectations(true) {
      MyClass c;
      {
        obj = c;
        invokeReturning(c.getFoo("foo", false), "bas");
      }
    };

    assert "bas".equals(obj.getFoo("foo", false));

    Expectations.assertSatisfied();
  }

  public static class MyClass {
    public String getFoo(String str, boolean bool) {
      if (bool) {
        return "foo";
      } else {
        return "bar";
      }
    }
  }
}

Dezavantajı, Java 5/6 gerektirmesidir.


Evet, gerçekten tavsiye edebilirim
Epaga

7
Sadece bir güncelleme: JMockit projesi code.google.com/p/jmockit adresine taşındı . Bu yazıdan bu yana A LOT geliştirdi (ve hala gelişiyor) ve şimdi kapsamlı belgelere sahip.
Rogério

JMockit tekrar taşındı. Şimdi Github'da. jmockit.github.io
Ravi Thapliyal

15

Groovy kullanarak testlere de göz atabilirsiniz. Groovy'de 'as' operatörünü kullanarak Java arayüzlerini kolayca taklit edebilirsiniz:

def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest 

Bu temel işlevsellik dışında Groovy, güçlü MockForve StubForsınıflar da dahil olmak üzere alaycı cephede çok daha fazlasını sunuyor .

http://docs.codehaus.org/display/GROOVY/Groovy+Mocks


13

EasyMock ile alay kullanmaya başladım . Anlamak yeterince kolay, ancak tekrar adımı biraz sinir bozucuydu. Mockito bunu kaldırır, ayrıca okunabilirliğin birincil hedeflerinden biri gibi göründüğü için daha temiz bir sözdizimine sahiptir. Bunun ne kadar önemli olduğunu vurgulayamıyorum, çünkü geliştiricilerin çoğu mevcut kodu okumak ve korumak için zaman harcayacaklar, onu yaratmak değil.

Bir başka güzel şey de, EasyMock Sınıf Uzantısını kullanmak için hatırlamanız gereken (ve kontrol ettiğiniz) EasyMock'un aksine arayüzler ve uygulama sınıflarının aynı şekilde ele alınmasıdır.

Geçenlerde JMockit hızlı bir göz attım ve özellikler çamaşır listesi oldukça kapsamlı olsa da, bunun fiyat ortaya çıkan kod okunabilirliği ve daha fazla yazmak zorunda olduğunu düşünüyorum.

Benim için Mockito tatlı noktaya vuruyor, yazması ve okuması kolay ve çoğu kodun gerektireceği durumların çoğuyla uğraşıyor. Kullanılması Mockito ile PowerMock benim seçimim olurdu.

Dikkate almanız gereken bir şey, kendiniz veya küçük sıkı bir ekipte gelişirseniz seçeceğiniz aracın, farklı beceri düzeylerine sahip geliştiricileri olan büyük bir şirket için en iyi seçenek olmayabilir. Okunabilirlik, kullanım kolaylığı ve basitlik ikinci durumda daha fazla dikkate alınmalıdır. Bir çok insan onu kullanmıyorsa veya testleri sürdürmüyorsa nihai alaycı çerçeveyi elde etmenin bir anlamı yok.


1
+1 Bu cevap için daha fazla oy gerekiyor. Kişi çerçeve hakkında gerçekten sevdikleri veya sevmedikleri şeyleri paylaşmalıdır. Sadece "Bunu kullandım .. ve beğendim!" bu tür iyi soruların SO'ya kapatılmasının nedenlerinden biridir.
Ravi Thapliyal

11

EasyMock ve EasyMock Class Extension'ı işte yoğun bir şekilde kullanıyoruz ve bundan oldukça memnunuz. Temel olarak ihtiyacınız olan her şeyi verir. Belgelere bir bakın, EasyMock'un tüm özelliklerini gösteren çok güzel bir örnek var.


1
Soruma göre, sahte bir çerçeve hakkında neyi sevdiğinizi ve sevmediğinizi arıyordum. Belgeleri bulabilir ve her şeyi okuyabilirim - Onu kullanan insanların ne düşündüğünü bilmek istiyorum.
Josh Brown

EasyMock yalnızca Java 5 ve üstü sürümlerde çalışır, değil mi?
matt b

8

JMock'u erken kullandım. Mockito'yu son projemde denedim ve beğendim. Daha özlü, daha temiz. PowerMock, Mockito'da bulunmayan, statik bir kodu alay etme, bir örnek oluşturma alay etme, son sınıfları ve yöntemleri alay etme gibi tüm ihtiyaçları kapsar. Yani işimi yapmak için ihtiyacım olan her şeye sahibim.


6

JMock'u seviyorum çünkü beklentileri ayarlayabilirsiniz. Bu, bazı sahte kitaplıklarda bir yöntemin çağrılıp çağrılmadığını denetlemekten tamamen farklıdır. JMock'u kullanarak çok karmaşık beklentiler yazabilirsiniz. Jmock hile kılıfına bakın .



4

Alay etmenin en iyi çözümü, makinenin tüm işleri otomatik spesifikasyon tabanlı testlerle yapmasını sağlamaktır. Java için, bkz. ScalaCheck ve İşlevsel Java kitaplığında bulunan Reductio çerçevesi . Otomatik spesifikasyon tabanlı test çerçeveleri ile test edilen yöntemin bir spesifikasyonunu sağlarsınız (bunun doğru olması gereken bir özellik) ve çerçeve otomatik olarak sahte nesnelerin yanı sıra testler de üretir.

Örneğin, aşağıdaki özellik Math.sqrt yöntemini test ederek n kare sayısının n değerinin karekökünün n'ye eşit olup olmadığını kontrol eder.

val propSqrt = forAll { (n: Int) => (n >= 0) ==> scala.Math.sqrt(n*n) == n }

Aradığınızda propSqrt.check(), ScalaCheck yüzlerce tamsayı üretir ve her biri için mülkünüzü kontrol eder, ayrıca kenar durumlarının iyi bir şekilde kapandığından emin olur.

ScalaCheck Scala'da yazılmış ve Scala Derleyicisi gerektirse de, Java kodunu test etmek kolaydır. İşlevsel Java'daki Reductio çerçevesi, aynı kavramların saf bir Java uygulamasıdır.


3

Mockito ayrıca, stubbing yöntemleri, argümanları eşleştirme (anyInt () ve anyString () gibi), çağrı sayısını (times (3), atLeastOnce (), never ()) ve daha fazlasını doğrulama seçeneği sunar .

Mockito'nun basit ve temiz olduğunu da buldum .

Mockito hakkında sevmediğim bir şey, statik yöntemleri saplayamamanızdır .


Bu cevap yanlış. JMock ile arayüzlerle sınırlı değilsiniz. Beton sınıfları ClassImposteriser ile taklit edebilirsiniz.
Teflon Ted

Aynı şeyleri EasyMock ile de yapabilirsiniz.
Cem Catikkas

Cevabımdaki yanlışlıkları kaldırdım.
Josh Brown

2

Bir şey için biraz farklı şunu kullanabilirsiniz JRuby ve Mocha birleştirildiği JtestR anlamlı ve özlü Ruby Java kodu için yazma testlerine. JtestR ile bazı yararlı alaycı örneği vardır burada . Bu yaklaşımın bir avantajı, alaycı somut sınıfların çok basit olmasıdır.


1

Alayları JMock üzerinden kullanmaya başladım, ama sonunda EasyMock'u kullanmaya geçtim. EasyMock sadece - daha kolay-- ve daha doğal hissi veren bir sözdizimi sağlıyordu. O zamandan beri geçiş yapmadım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.