Soyut sınıflar, soyut yöntemleri içerebilen veya içermeyebilen, soyut anahtar kelimeyle bildirilen sınıf olarak adlandırılır. Java'da soyut sınıflar oluşturulamaz ancak alt sınıflara ayrılabilirler. Ayrıca statik alanlara ve statik yöntemlere de sahip olabilir.
Bu bölümde soyut sınıfların alay edilmesini veya casusluk yapılmasını tartışacağız. Soyut sınıfların soyut olmayan yöntemler kullanılarak test edildiği birkaç durumu analiz edeceğiz.
Soyut sınıfları gözetlemek veya alay etmek için aşağıdaki Maven bağımlılıklarını eklememiz gerekir:
- JBirim
- Mockito
- PowerMock
Projenin gerekli tüm bağımlılıkları aşağıda verilmiştir:
junit junit 4.12 test org.mockito mockito-all 1.10.19 test org.powermock powermock-module-junit4 1.7.4 test org.powermock powermock-api-mockito 1.7.0 test
PowerMock bağımlılıkları yalnızca PowerMock'u kullandığımız test için gereklidir.
Alaycı Soyut Sınıf Örnekleri
1. Mockito.spy() kullanarak soyut sınıfı gözetlemek
Bu örnekte soyut sınıfları Mockito.spy() yöntemini kullanarak gözetleyeceğiz. Mockito.spy() yöntemi, soyut sınıfın casus örneğini oluşturmak için kullanılır.
Aşama 1: Hem soyut hem de soyut olmayan yöntemleri içeren Abstract1_class adında soyut bir sınıf oluşturun.
Özet1_class.java
public abstract class Abstract1_class { public abstract int newAbstractmethod(); public String methodUnderTest() { return 'one' ; } }
Adım 2: Adlı bir JUnit test senaryosu oluşturun Özet1Test . Soyut sınıfın bir casus örneğini içerir.
Özet1Test.java
import static org.junit.Assert.*; import org.junit.Test; import org.mockito.Mockito; import junit.framework.Assert; public class Abstract1Test { @Test public void testing_usingSpy() { Abstract1_class abstclas = Mockito.spy(Abstract1_class.class); String res = abstclas.methodUnderTest(); Assert.assertEquals('one', res); } }
Çıktı
Aşağıdaki çıktı testin başarıyla çalıştığını göstermektedir.
Mockito.spy() yöntemini kullanmanın dezavantajı, casus örneğinin oluşturulması sırasında soyut sınıf yapıcısını çağırmasıdır. Çoğu durumda yapıcı, birim test yürütmelerimize engel olabilecek dış bağımlılıklar kullanır. Bu dış bağımlılıklar genellikle şu şekilde bilinir: test engelleri . Soyut sınıflarla alay etmek için Mockito.mock() yönteminin kullanılmasının nedeni budur.
2. Mockito.mock() kullanarak soyut sınıfla alay etmek
Bu örnekte soyut sınıflarla Mockito.mock() yöntemini kullanarak alay edeceğiz.
Genellikle alay etme, sınıfın bir klonunu veya kukla nesnesini oluşturmak için kullanılır. Başka bir deyişle, bir sınıfı kendi mantığından veya algoritmalarından arındırır. Oluşturulan sahte örnek, yöntemlerin içinde kod (mantık) içermiyor.
Aşama 1: Hem soyut hem de soyut olmayan yöntemleri içeren Abstract_Class adında soyut bir sınıf oluşturun.
Soyut_Sınıf.java
public abstract class Abstract_Class { public String sayMock() { return 'Hii.. ' + getName() + symbol() ; } private String symbol() { return '!!'; } protected abstract String getName(); }
Adım 2: Adlı bir JUnit test senaryosu oluşturun SoyutTest Sınıfı soyut sınıfla alay ettiğin için.
SoyutTestClass.java
import static org.junit.Assert.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.junit.Test; public class AbstractTestClass { @Test public void test_AbstractClasses() { Abstract_Class ac = mock(Abstract_Class.class); when(ac.sayMock()).thenCallRealMethod(); when(ac.getName()).thenReturn('Jyotika'); assertEquals('Hii.. Jyotika!!', ac.sayMock()); } }
Yukarıdaki kodda, Ve Mockito.mock() yöntemi kullanılarak oluşturulmuş sahte bir örnektir.
Çıktı
Aşağıdaki çıktı, testin Mockito kullanılarak başarıyla çalıştırıldığını gösterir.
Yukarıdaki yaklaşım en iyisi değildir, ancak kullanılabilir. Bir sonraki yaklaşım PowerMock kullandığı ve soyut sınıflarda tanımlanan özel yöntemler üzerinde kontrol sahibi olabileceği için önerilir.
3. PowerMock kullanarak soyut sınıfla alay etmek
Aşağıdaki örnekte soyut sınıflarla alay etmek için PowerMockito.mock() yöntemini kullanacağız. Mockito.mock() yerine PowerMock kullanmak daha iyi bir yaklaşımdır çünkü hem özel hem de statik yöntemler üzerinde kontrol sahibi olabilir.
Aşama 1: Adlı soyut bir sınıf oluşturun Soyut_sınıf hem soyut hem de soyut olmayan yöntemleri içerir.
Soyut_sınıf.java
public abstract class Abstract_Class { public abstract int myAbstractMethod(); public String sayMock() { return getName() + '13' ; } private String getName() { return 'Jyotika'; } }
Adım 2: Adlı bir JUnit test senaryosu oluşturun SoyutTest Sınıfı test amaçlı.
SoyutTestClass.java
import static org.junit.Assert.*; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest( Abstract_Class.class) public class AbstractTestClass { @Test public void test_AbstractClassesusing_PowerMock() throws Exception { // given Abstract_Class ac = PowerMockito.mock(Abstract_Class.class); PowerMockito.doCallRealMethod().when(ac).sayMock(); PowerMockito.doReturn('Sharma').when(ac , 'getName'); //when String newstring = ac.sayMock(); //then assertEquals('Sharma13', newstring); System.out.println(newstring); } }
Çıktı
kaç tane görev imkansız film var
Aşağıdaki çıktı, testin Mockito ile PowerMock kullanılarak başarıyla çalıştırıldığını gösterir.