Saya belajar TDD dan saya ragu saat menggunakan Mock dengan mockito dan junit.

Without mocks:   
Contacto contacto = new Contacto("Santiago", "3022653192", "santi-1524@hotmail.com");
        agenda.agregarContacto(contacto);
        Assert.assertEquals(1, agenda.getSizeOfAgenda());
        agenda.agregarContacto(contacto);
With mocks:
        Mockito.verify(agenda).agregarContacto(contacto);
        Mockito.when(agenda.getSizeOfAgenda()).thenReturn(1);
        Assert.assertEquals(1, agenda.getSizeOfAgenda());

Jika saya melakukan tes tanpa mengolok-olok itu membutuhkan waktu lebih sedikit daripada melakukan tes dengan Tes misalnya: 2ms vs 356ms.

Apa manfaat melakukan tes dengan Mockito dalam kasus ini?

0
Santiago molano perdomo 21 September 2019, 18:57

1 menjawab

Jawaban Terbaik

Agak kehilangan titik mengejek. Anda menggunakan tiruan untuk memastikan ( mengejek ) perilaku layanan di sekitarnya / dependensi eksternal dan segala sesuatu yang tidak harus dilakukan secara langsung dengan apa yang ingin Anda uji.

Dalam contoh Anda jika Anda menguji layanan agenda Anda, Anda akan mengejek kontak tersebut karena tidak relevan konten apa yang dimilikinya selama contact masuk dalam agenda. Jika Anda juga memiliki katakanlah calendar di agenda Anda akan mengejek calendar itu juga.

apa manfaat melakukan tes dengan Mockito dalam kasus ini?

Dalam kasus Anda, ejekan digunakan dengan cara yang salah. Contoh jelas mengapa Anda ingin mengejek adalah Layanan yang akan menyimpan sesuatu ke database Anda.

public class SomeService {
  private SomeRepository repo;
  public SomeService(SomeRepository repo){
    this.repo = repo;
  }
  public YourClass save(YourClass clazz){
    repo.save(clazz);
  }
}

public class SomeRepository {
  private Connection yourDatabaseConnection;

  public YourClass save(YourClass clazz){
    yourDatabaseConnection.save(clazz);
  }
}

Jadi jangan repot-repot bagaimana koneksi diatur. Ketika Anda akan menjalankan tes dari SomeService ini akan memanggil repo Anda sehingga menyimpan sesuatu di database Anda. Artinya Anda harus menyiapkan database dan mengurus data di dalamnya yang dapat menimbulkan masalah jika Anda menjalankan beberapa tes atau tes secara paralel (jika Anda dan salah satu perguruan tinggi Anda menjalankan tes yang sama dengan Anda pada saat yang sama). Semua ini merepotkan dan berada di luar teori pengujian unit. Unit Anda adalah Layanan dalam skenario ini SomeService. Jadi Anda hanya perlu menguji ini.

@Test
public void test(){
  final SomeRepository repo = mock(SomeRepository.class);
  final SomeService serv = new SomeService(repo);

  final YourClass clazz = mock(YourClass.class);

  when(repo.save(clazz)).thenReturn(clazz);

  YourClass response = serv.save(clazz);

  Assert.assertEquals(clazz,response);

  verify(repo).save(clazz);
}

Dengan cara ini Anda memvalidasi layanan Anda mengembalikan objek Anda tanpa ada mutasi di tengah karena ini adalah perilaku yang diharapkan dari pengaturan di atas. Anda memvalidasinya disebut repositori tetapi Anda tidak pernah benar-benar memanggilnya. Dengan cara ini tidak ada data yang akan ditambahkan dalam database Anda (artinya Anda tidak memerlukan database) dan pengujian diisolasi dan dapat dijalankan secara paralel jutaan kali dan selalu memiliki hasil yang sama.

1
Michael Michailidis 3 Oktober 2019, 08:34