我想用假資料模擬資料庫呼叫,但我陷入了以下情況:
我的服務
public class MyService {
// some stuff
Page<SampleDto> sample = repo.findAllSample();
// other stuff
}
我想存根,when()但我無法做到這一點。我的測驗是:MyServiceTest
public class MySampleTest {
@Test
void myTest() {
// initialisation and all stuff
when(myRepo.findAll()).thenReturn(......)
// I want to pass 2 fake SampleDto from
// here but don't know how to do that
}
}
uj5u.com熱心網友回復:
只需創建您想要回傳的內容并將其傳遞給thenReturn().
在您的情況下,它可能如下所示:
// I making this up, because you did not state what 'Page' actually is
var result = new Page();
result.add(new SampleDto(1));
result.add(new SampleDto(2));
when(myRepo.findAllSample()).thenReturn(result);
您可能無法執行此操作,具體取決于 的實際實作Page,例如,如果這是 JPA Page。在這種情況下,您Page無論如何都不應該真正回傳到您的服務中,而是將 JPA 存盤庫包裝到一個回傳List<SampleDto>或Set<SampleDto>代替的配接器存盤庫中。否則,屬于域的服務將依賴于基礎設施代碼(如 JPA)的實作細節,這很少是一個好主意。
uj5u.com熱心網友回復:
通常有兩個主要方向可以解決此類任務:
- 假貨
- 嘲諷
假物件方法是你的 repo 的簡單實作,沒有任何輕量級/簡單情況的第三方庫:
public class FakeRepo implements Repo<T> {
private final Collection<T> all;
public FakeRepo(){
this(Collections.emptySet());
}
public FakeRepo(Collection<T> all){
this.all = all;
}
@Override
public Collection<T> findAll(){
return this.all;
}
}
在你的測驗中可能看起來像
@Test
public void justdoit(){
MyService service = new MyService(
new FakeRepo(Arrays.asList(1,2))
);
// test the service & methods
}
Mocking允許您制定更復雜的解決方案。請注意方法Mockito.mock(ArrayList.class)和Mockito.spy(new ArrayList<String>())。您需要使用 Mockito 引擎(如https://www.baeldung.com/mockito-annotations)組裝復雜的物件
@Test
public void whenNotUseMockAnnotation_thenCorrect() {
List mockList = Mockito.mock(ArrayList.class);
mockList.add("one");
Mockito.verify(mockList).add("one");
assertEquals(0, mockList.size());
Mockito.when(mockList.size()).thenReturn(100);
assertEquals(100, mockList.size());
}
或者
@Test
public void whenNotUseSpyAnnotation_thenCorrect() {
List<String> spyList = Mockito.spy(new ArrayList<String>());
spyList.add("one");
spyList.add("two");
Mockito.verify(spyList).add("one");
Mockito.verify(spyList).add("two");
assertEquals(2, spyList.size());
Mockito.doReturn(100).when(spyList).size();
assertEquals(100, spyList.size());
}
uj5u.com熱心網友回復:
Page如果需要在您的服務類中處理一些其他功能,您也可以模擬該物件。假設您的服務類實際上是這樣的:
public class MyService {
@Resource
private SampleRepository repo;
public Page<SampleDto> findAllSample() {
var sampleData = repo.findAllSample();
// perhaps some operations with sample data and page
return sampleData;
}
}
那么測驗類可能類似于(JUnit4):
@RunWith(MockitoJUnitRunner.class)
public class MySampleTest {
@Mock
private SampleRepository repo;
@Mock
private Page<SampleDto> page;
@InjectMocks
private MyService myService;
@Test
public void test() {
doReturn(page).when(repo).findAll();
var listSampleDtos = List.of(new SampleDto()); // populate with what you need
doReturn(listSampleDtos).when(page).getContent();
var page = myService.findAllSample();
// ... do the asserts, just as an example:
verify(repo).findAll(); // called
assertEquals(1, page.getContent().size());
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/379988.html
上一篇:角度單元測驗-沒有父組件的提供者
