• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Testowanie REST APi przy użyciu MOCKITO

Object Storage Arubacloud
0 głosów
251 wizyt
pytanie zadane 18 września 2018 w Java przez Tomek Reda Obywatel (1,110 p.)

Witam mam problem z testowaniem REST API przy użyciu MOCKITO    

Mam przykładowy kod rest controller:

@RestController
@RequestMapping(path = "api/workers")
public class WorkOfferController {

    @Autowired
    private  WorkerService workerService;

    @PostMapping(value = "/lists", consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity searchWorker(@RequestBody RecruitmentSearchRequest recruitmentSearchRequest, @RequestParam("page") int page,     @RequestParam("size") int size,) throws NoSuchFieldException {
    System.err.print('WorkerController');
            return workerService.getWorkers(recruitmentSearchRequest, page, size);
    }
}

Oraz odpowiedni do niego serwis:

@Service
@Transactional
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class WorkerService {

    private final WorkerRepistory workerRepository;
    private final UserRepository userRepository;

    public ResponseEntity getWorkers(RecruitmentSearchRequest recruitmentSearchRequest,int pageNumber, int size) throws NoSuchFieldException {
    System.err.print('WorkerService');
    ...
    }

}


I chce przetestować czy pod przeJsciem pod taki url z odpowiednimi danymi  wszystko jest okej. Nie chce używać do tego bazy danych dlatego wole Mockito.

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@SpringBootTest(classes = Appp2workApplication.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class PharmacyWorkOfferRestDocsTests {

    private MockMvc mockMvc;

    @InjectMocks
    private WorkOfferController workOfferController;

    @Mock
    private WorkerService workerService;

    @Mock
    UserRepository userRepository;

    @Mock
    WorkerRepistory workerRepository;


    @Before
    public void setUp() {
        this.mockMvc = MockMvcBuilders.standaloneSetup(workOfferController).build();
    }

    @Test
    public void searchWorkOfferListWithParameters() throws Exception {
        String payload = "{\n" +
                "\t\"name\":\"tomek\",\n" +
                "\t\"searchFromSalary\":5,\n" +
                "}";

        Mockito.doNothing().when(userRepository.save(Mockito.anyObject()));

        this.mockMvc.perform(post("/api/workers/lists?page=0&size=20").contentType(MediaType.APPLICATION_JSON).content(payload))
                .andExpect(status().isOk());
    }
}

I mam problem że z takim podejsciem test wchodzi mi do controller i wyświetla  "WorkerController" ale już z tego controllera nie chce wejść mi do serwisu i niby zwraca 200 ale tak naprawdę wszedł tylko do controllera i tyle . Jest to spowodowane zapewne dlatego że WorkerService jest jako Mock ale probówałem go dać jako np. Autowired albo InjectMock i jest ciągle to samo . 
Co robię nie tak że wchodzi mi do controllera ale z tego controllera do odpowiedniego serwisu już nie chce  ?

1 odpowiedź

0 głosów
odpowiedź 18 września 2018 przez mbabane Szeryf (79,280 p.)
edycja 18 września 2018 przez mbabane

Nie chce Ci wejść do serwisu dlatego, że jest mockiem.

@Mock
 private WorkerService workerService;

 

Zrób to może tak, że tylko samo Repo jest mockiem a serwis już nie. Dodawaj instancje serwisu przez konstruktor w kontrolerze. W serwisie rownież repo podawaj przez konstruktor.

@Service
public class Service
{
      private Repository repo;

       @Autowierd
      public Service (Repository repo)
     {
              this.repo = repo;
      }

//metody serwisu
}
@RestController
public class Controller
{
    private Service service;

    @Autowierd
    public Controller(Service service)
    { 
       this.service = service;
    }

//endpointy
}

I teraz test:

Repository repo = mock(Reposiotry.class);

SomeObject someMockObject = new SomeObject(); //to jest obiekt, ktory zwraca baza - bez znaczenia w tym przypadku co to dokladnie bedzie

when(repo.someRepoMethod( anyObject() ).thenReturn( someMockObject);

Service service = new Service(repo);

Controller controller = new Controller(service);

MockMvc mockMvc = MockMvcBuilders.standaloneSetup( controller ).build;


//testy na mockMvc

I jeszcze jedna rzecz serwis niech zwraca zwykły obiekt nie będący ResponseEntity. To zadaniem kontrolera jest budowa odpowiedzi na podstawie danych z serwisu.

komentarz 18 września 2018 przez Tomek Reda Obywatel (1,110 p.)

Witam serdecznie. Ta aplikacja nie jest moja znaczy podłączyłem się pod taką aplikacje kumpli i dali mi zadanie teraz żebym zrobił kumpli więc za bardzo logiki sewrisów nie moge ruszyć .. 

Nie wiem czy dobrze rozumiem.Mam wstrzyknąć serwis w kontrolerze przez construktor ?

@RestController
@RequestMapping(path = "api/workers")
public class WorkOfferController {
 
  
    private  WorkerService workerService;

   @Autowired
    WorkOfferController(WorkerService workerService)
   {
     this.workerService=workerService;
   }
 
    @PostMapping(value = "/lists", consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity searchWorker(@RequestBody RecruitmentSearchRequest recruitmentSearchRequest, @RequestParam("page") int page,     @RequestParam("size") int size,) throws NoSuchFieldException {
    System.err.print('WorkerController');
            return workerService.getWorkers(recruitmentSearchRequest, page, size);
    }
}

Następnie w Tescie 


@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@SpringBootTest(classes = Appp2workApplication.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class PharmacyWorkOfferRestDocsTests {
 
    private MockMvc mockMvc;
    
    @Autowired
    private WorkerService workerService; 

    @InjectMocks
    private WorkOfferController workOfferController=new WorkerOfferController(workerService);
 

 
    @Mock
    UserRepository userRepository;
 
    @Mock
    WorkerRepistory workerRepository;
 
 
    @Before
    public void setUp() {
        this.mockMvc = MockMvcBuilders.standaloneSetup(workOfferController).build();
    }
 
    @Test
    public void searchWorkOfferListWithParameters() throws Exception {
        String payload = "{\n" +
                "\t\"name\":\"tomek\",\n" +
                "\t\"searchFromSalary\":5,\n" +
                "}";
 
        Mockito.doNothing().when(userRepository.save(Mockito.anyObject()));
 
        this.mockMvc.perform(post("/api/workers/lists?page=0&size=20").contentType(MediaType.APPLICATION_JSON).content(payload))
                .andExpect(status().isOk());
    }
}

 

komentarz 18 września 2018 przez mbabane Szeryf (79,280 p.)
edycja 18 września 2018 przez mbabane

Znaczy się moj przykład jest taki że nie używa adnotacji Mockito. Jeśli chcesz użyć adnotacji to zdaje się że to powinno wyglądać tak:

private MockMvc mockMvc;
   
@Mock
private UserRepository userRepository;
  
@Mock
private WorkerRepistory workerRepository;
 
@InjectMocks
private WorkerService workerService; 

private WorkOfferController workerOfferController;

@Before
public void setup()
{
        workOfferController=new WorkerOfferController(workerService);
         mockMvc = MockMvcBuilders.standaloneSetup( workOfferController ).build();
}

//testy

 

1
komentarz 18 września 2018 przez Tomek Reda Obywatel (1,110 p.)
Wielkie dzięki :) Działa :) !

Podobne pytania

0 głosów
0 odpowiedzi 403 wizyt
pytanie zadane 10 września 2017 w Java przez miro Pasjonat (23,870 p.)
0 głosów
1 odpowiedź 286 wizyt
pytanie zadane 17 kwietnia 2021 w Java przez Lulex Użytkownik (820 p.)
0 głosów
0 odpowiedzi 137 wizyt
pytanie zadane 21 października 2017 w Java przez ShiroUmizake Nałogowiec (46,300 p.)

92,568 zapytań

141,424 odpowiedzi

319,634 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...