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;