Saya memiliki kelas seperti di bawah ini:
public class A {
public A(String test) {
bla bla bla
}
public String check() {
bla bla bla
}
}
Logika dalam konstruktor A(String test)
dan check()
hal-hal yang saya coba tiru. Saya ingin panggilan seperti: new A($$$any string$$$).check()
mengembalikan string tiruan "test"
.
Saya mencoba:
A a = mock(A.class);
when(a.check()).thenReturn("test");
String test = a.check(); // to this point, everything works. test shows as "tests"
whenNew(A.class).withArguments(Matchers.anyString()).thenReturn(rk);
// also tried:
//whenNew(A.class).withParameterTypes(String.class).withArguments(Matchers.anyString()).thenReturn(rk);
new A("random string").check(); // this doesn't work
Tapi sepertinya itu tidak berhasil. new A($$$any string$$$).check()
masih melalui logika konstruktor alih-alih mengambil objek tiruan dari A
.
Jawaban:
Kode yang Anda poskan berfungsi untuk saya dengan versi terbaru Mockito dan Powermockito. Mungkin Anda belum menyiapkan A? Coba ini:
A. java
public class A { private final String test; public A(String test) { this.test = test; } public String check() { return "checked " + this.test; } }
MockA.java
import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(A.class) public class MockA { @Test public void test_not_mocked() throws Throwable { assertThat(new A("random string").check(), equalTo("checked random string")); } @Test public void test_mocked() throws Throwable { A a = mock(A.class); when(a.check()).thenReturn("test"); PowerMockito.whenNew(A.class).withArguments(Mockito.anyString()).thenReturn(a); assertThat(new A("random string").check(), equalTo("test")); } }
Kedua pengujian harus lulus dengan mockito 1.9.0, powermockito 1.4.12 dan junit 4.8.2
sumber
PrepareForTest
Sepengetahuan saya, Anda tidak bisa mengejek konstruktor dengan mockito, hanya metode. Tetapi menurut wiki di halaman kode google Mockito ada cara untuk meniru perilaku konstruktor dengan membuat metode di kelas Anda yang mengembalikan contoh baru dari kelas itu. maka Anda bisa mengejek metode itu. Di bawah ini adalah kutipan langsung dari wiki Mockito :
Jika Anda hanya ingin mengembalikan objek yang diejek dari kelas Anda, saya pikir ini seharusnya berhasil untuk Anda. Bagaimanapun, Anda dapat membaca lebih lanjut tentang pembuatan objek tiruan di sini:
http://code.google.com/p/mockito/wiki/MockingObjectCreation
sumber
Tanpa Menggunakan Powermock .... Lihat contoh di bawah ini berdasarkan jawaban Ben Glasser karena saya butuh waktu untuk mengetahuinya .. harap itu menghemat waktu ...
Kelas Asli:
public class AClazz { public void updateObject(CClazz cClazzObj) { log.debug("Bundler set."); cClazzObj.setBundler(new BClazz(cClazzObj, 10)); } }
Kelas yang Dimodifikasi:
@Slf4j public class AClazz { public void updateObject(CClazz cClazzObj) { log.debug("Bundler set."); cClazzObj.setBundler(getBObject(cClazzObj, 10)); } protected BClazz getBObject(CClazz cClazzObj, int i) { return new BClazz(cClazzObj, 10); } }
Kelas Tes
public class AClazzTest { @InjectMocks @Spy private AClazz aClazzObj; @Mock private CClazz cClazzObj; @Mock private BClazz bClassObj; @Before public void setUp() throws Exception { Mockito.doReturn(bClassObj) .when(aClazzObj) .getBObject(Mockito.eq(cClazzObj), Mockito.anyInt()); } @Test public void testConfigStrategy() { aClazzObj.updateObject(cClazzObj); Mockito.verify(cClazzObj, Mockito.times(1)).setBundler(bClassObj); } }
sumber
Dengan mockito Anda bisa menggunakan withSettings (), misalnya jika CounterService membutuhkan 2 dependensi, Anda bisa meneruskannya sebagai tiruan:
UserService userService = Mockito.mock(UserService.class); SearchService searchService = Mockito.mock(SearchService.class); CounterService counterService = Mockito.mock(CounterService.class, withSettings().useConstructor(userService, searchService));
sumber
Mockito memiliki keterbatasan dalam menguji metode final, statis, dan privat.
dengan pustaka pengujian jMockit, Anda dapat melakukan beberapa hal dengan sangat mudah dan langsung seperti di bawah ini:
Konstruktor tiruan dari kelas java.io.File:
new MockUp<File>(){ @Mock public void $init(String pathname){ System.out.println(pathname); // or do whatever you want } };
Meniru metode statis:
sumber