Bir alt sınıf tarafından gerçekleştirilen ancak soyut bir süper sınıftan miras alınan korumalı bir yöntemle alay etmek için Mockito veya PowerMock nasıl kullanılır? Başka bir deyişle, "doSomethingElse" alay ederken "doSomething" yöntemini test etmek istiyorum. Burada verilenSoyut sınıftan miras alınan korunan alt sınıf yöntemiyle nasıl dalga geçilir?
Özet süper sınıf
public abstract class TypeA {
public void doSomething() {
// Calls for subclass behavior
doSomethingElse();
}
protected abstract String doSomethingElse();
}
Alt sınıf uygulaması
public class TypeB extends TypeA {
@Override
protected String doSomethingElse() {
return "this method needs to be mocked";
}
}
Çözüm
Cevapları bir doğru Eğer ilgili sınıflar aynı pakette ise d çalışacaktır.
Farklı paketlerde varsa, bir seçenek PowerMock kullanıcısıdır. Aşağıdaki örnek benim için çalıştı. Elbette bunu yapmanın başka yolları da olabilir, bu işe yarar.
import static org.junit.Assert.assertEquals;
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({ TypeB.class })
public class TestAbstract {
@Test
public void test_UsingPowerMock() throws Exception {
// Spy a subclass using PowerMock
TypeB b = PowerMockito.spy(new TypeB());
String expected = "some value for mock";
// Mock a method by its name using PowerMock again
PowerMockito.doReturn(expected).when(b, "doSomethingElse");
// Calls the
String actual = b.doSomething();
assertEquals(expected, actual);
}
}
Not: Java 5, JUnit 4.11, Mockito 1.9.0 ve PowerMock 1.4.12 kullanılarak yapılır Testler.
Bu yaklaşım bana Java 8, JUnit 4.12 ve PowerMock 1.6.4 ile bir 'NullPointerException' veriyor. – Mack