Java 尽管有`when()`方法,它仍然返回null
我想测试控制器方法是否返回Java 尽管有`when()`方法,它仍然返回null,java,junit,mockito,mockmvc,Java,Junit,Mockito,Mockmvc,我想测试控制器方法是否返回http状态200 @Slf4j @Controller public class AcknowledgeAlertsServiceImpl implements AcknowledgeAlertsService { ... @Override @RequestMapping(value = SERVICE_MAPPING, method = POST) public @ResponseBody ResponseEntity
http状态200
@Slf4j
@Controller
public class AcknowledgeAlertsServiceImpl implements AcknowledgeAlertsService {
...
@Override
@RequestMapping(value = SERVICE_MAPPING, method = POST)
public @ResponseBody
ResponseEntity acknowledge(@PathVariable(ALERT_ID) String alertId) {
....
try {
Map.Entry<AlertID, AlertJTO> entry = cache.findUserEntryById(alertId, userLogin);
...
return new ResponseEntity(HttpStatus.OK);
} catch (Exception ex) {
...
return new ResponseEntity(HttpStatus.BAD_REQUEST);
}
}
}
测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(位置={…})
@WebAppConfiguration
公共类AcknowledgeAllertsServiceImplTest{
专用静态最终字符串警报\u ID=“123”;
...
私有MockMvc-MockMvc;
...
...
@试验
public void acknowledgeOfExistingAlert()引发异常{
//给定
UserData UserData=mock(UserData.class);
AlertID AlertID=mock(AlertID.class);
AlertJTO-AlertJTO=mock(AlertJTO.class);
Map.Entry=newAbstractMap.SimpleEntry(alertID,alertJTO);
//什么时候
当(flightmapUserContext.getUserData())。然后返回(userData);
当(cache.findUserEntryById(any(),any())。然后返回(条目);
//然后
mockMvc.perform(MockMvcRequestBuilders.post(url(),警报ID)
.param(AcknowledgeAllertsService.ALERT\u ID,ALERT\u ID))
.andExpect(MockMvcResultMatchers.status()
.isOk());
}
我想你失踪了
@InjectMocks
FlightAcknowledgeAlertsServiceImpl controllerUnderTest;
所以控制器实例不会得到模拟。我认为您丢失了
@InjectMocks
FlightAcknowledgeAlertsServiceImpl controllerUnderTest;
所以控制器实例不会得到mock。看看Spring的
@MockBean
注释。删除@injectmock
,只留下:
@RunWith(SpringRunner.class)
@WebMvcTest(SomeController.class)
公共类SomeControllerIT{
@蚕豆
私人AlertsCache AlertsCache;
@自动连线
私有MockMvc-MockMvc;
@以前
公共作废设置(){
when(alertsCache.findUserById(anyLong())。然后return(someEntry);
}
}
然后执行正常的when/thenReturn操作。看看Spring的
@MockBean
注释。删除@InjectMocks
,只留下:
@RunWith(SpringRunner.class)
@WebMvcTest(SomeController.class)
公共类SomeControllerIT{
@蚕豆
私人AlertsCache AlertsCache;
@自动连线
私有MockMvc-MockMvc;
@以前
公共作废设置(){
when(alertsCache.findUserById(anyLong())。然后return(someEntry);
}
}
然后执行正常的when/thenReturn操作。从您提供的代码中不清楚userLogin在实际代码中来自何处。它是否等于“when”中的“login”?同样,我没有看到任何会返回“login”的模拟,您只在调用
when(alertsCache.findUserEntryById(“123”,“login”))时显示它的用法。然后返回(条目);
。只需调试`Map.Entry Entry=alertsCache.findUserEntryById(alertId,userLogin);`并确保userLogin==“login”另一个选项是将when(alertsCache.findUserEntryById(“123”,“login”)
替换为when(alertsCache.findUserEntryById(any(),any())
-如果有效,则值与您提供的代码不同。不清楚userLogin在实际代码中来自何处。它是否等于“何时”中的“登录”?同样,我没有看到任何会返回“登录”的模拟,您仅在调用何时(alertsCache.findUserEntryById(“123”,“登录”))时显示它。然后返回(条目)
。只需调试`Map.Entry Entry=alertsCache.findUserEntryById(alertId,userLogin);`并确保userLogin==“login”另一个选项是将when(alertsCache.findUserEntryById(“123”,“login”)
替换为when(alertsCache.findUserEntryById(any(),any())
-如果有效,则值不同
@InjectMocks
FlightAcknowledgeAlertsServiceImpl controllerUnderTest;