2016-07-03 204 views
0

這是我第一次嘗試Mockito。Mockito測試控制器

我控制器

@RequestMapping(value = "/add", method = RequestMethod.POST) 
    @ResponseBody 
    public ValidationResponse startVisitForPatient(PatientBO patientBO,Locale locale) { 
     ValidationResponse res = new ValidationResponse(); 
     if (patientManagementService.startVisit(patientBO.getId())){ 
      res.setStatus(MessageStatus.SUCCESS); 
      res.setValue(messageSource.getMessage("success.message", null, locale)); 
     } 
     else{ 
      res.setValue(messageSource.getMessage("failed.message", null, locale)); 
      res.setStatus(MessageStatus.FAILED); 
     } 
     return res; 
    } 

服務

@Transactional 
    public boolean startVisit(long id) { 
     Patient patient = patientRepository.findOne(id); 
     Set<Encounter> encounters = patient.getEncounters(); 
     Encounter lastEncounter = null; 
     Timestamp startVisitDate = null; 
     Timestamp endVisitDate = null; 
     if (encounters.iterator().hasNext()){ 
      lastEncounter = encounters.iterator().next(); 
      startVisitDate = lastEncounter.getStartVisitDate(); 
      endVisitDate = lastEncounter.getEndVisitDate(); 
     } 
     if (lastEncounter == null || (endVisitDate != null && endVisitDate.after(startVisitDate))){ 
      Encounter newEncounter = new Encounter(); 
      newEncounter.setCreatedBy(userService.getLoggedUserName()); 
      newEncounter.setCreatedDate(new Timestamp(new Date().getTime())); 
      newEncounter.setModifiedBy(userService.getLoggedUserName()); 
      newEncounter.setModifiedDate(newEncounter.getCreatedDate()); 
      newEncounter.setPatient(patient); 
      newEncounter.setStartVisitDate(newEncounter.getCreatedDate()); 
      encounters.add(newEncounter); 
      return true; 
     } 
     else 
      return false; 
    } 

單元測試

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({ "file:src/main/webapp/WEB-INF/root-context.xml", 
     "file:src/main/webapp/WEB-INF/applicationContext.xml", 
     "file:src/main/webapp/WEB-INF/securityContext.xml" }) 
@WebAppConfiguration 
public class Testing { 


    @InjectMocks 
    StaffVisitManagementController staffVisitManagementController; 

    @Mock 
    PatientManagementService patientManagementService; 

    @Mock 
    View mockView; 

    MockMvc mockMvc; 

    @Before 
    public void setUp() throws Exception { 
     MockitoAnnotations.initMocks(this); 
     mockMvc = MockMvcBuilders.standaloneSetup(staffVisitManagementController) 
       .setSingleView(mockView) 
       .build(); 
    } 

    @Test 
    public void testStartVisit() throws Exception { 
     mockMvc.perform(post("/staff/visit/add").param("id", "1")) 
       .andExpect(status().isOk()).andExpect(content().string("success")); 
    } 
} 

的測試方法確實調用控制器。但是我無法調試此線上的服務

patientManagementService.startVisit(patientBO.getId())) 

它返回的只是false

我在這裏錯過了什麼?

+0

你究竟在這裏如何使用Mockito?我看不出任何嘲笑,所以目前還不清楚爲什麼你用Mockito標記了這個。 – ipsi

+0

對不起,我應該發佈更完整的代碼。請看更新的問題。謝謝! – abiieez

回答

2

當你嘲笑Mockito的東西時,它會嘲笑的一切返回某種默認值。對於對象,這是null。對於整數/雙打/等,這是0,布爾值,false。請參閱Mockito Docs。所以你不能進入它,因爲它不是你的班級出現在被測試的控制器中,它是一個生成的代理,只是假裝成你的班級(因此,嘲笑)。

如果你想改變你的類的行爲,你將需要使用Mockito來告訴它返回不同的變量,這取決於傳遞給方法的內容或者它運行的是哪個測試。

when(patientManagementService.startVisit(1)).thenReturn(true); 

將意味着,如果使用的是嘲笑PatientManagementService電話patientManagementService.startVisit(patientBO.getId())其中patientBO.getId()回報1,那麼它將返回true任何代碼,否則將返回false,這是默認的答案。

就你而言,如果你想能夠進入你的服務層代碼,我懷疑你最好嘲笑patientRepository,而不是patientManagementService

編輯:

大約我的建議是:

private StaffVisitManagementController staffVisitManagementController; 

private PatientManagementService patientManagementService; 

@Mock 
private PatientRepository patientRepository; 

@Before 
public void setup() { 
    MockitoAnnotations.initMocks(this); 
    when(patientRepository.findOne(1)).thenReturn(new Patient()); 
    patientManagementService = new PatientManagementService(patientRepository); 
    staffVisitManagementController = new StaffVisitManagementController(patientManagementService); 
    mockMvc = MockMvcBuilders.standaloneSetup(staffVisitManagementController) 
      .setSingleView(mockView) 
      .build(); 
} 

顯然,庫類的名稱可能不同,你可以使用領域注入,而不是構造函數注入等等等,但除此之外,這應該允許你用調試器進入PatientManagementService。你將無法進入PatientRepository,因爲這將被嘲笑。

+0

感謝您的信息。你能用我的代碼來說明嗎? – abiieez

+0

看看編輯,我強烈建議通過Mockito文檔 - 它有很多功能,比我可以合理地涵蓋在這個答案。 – ipsi

+0

當然,你的回答非常有幫助。謝謝 ! – abiieez