Mockito未返回预期的返回值

n1bvdmb6  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(152)

我正在做一个Java项目,并尝试使用Mockito。下面是我的测试代码:

@SpringBootTest
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
public class TestMainController {
    @MockBean
    MainController mainController;

    @MockBean
    AnotherServiceImpl anotherService;

    @Autowired
    private MockMvc mockMvc;

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders.standaloneSetup(mainController).build();
    }

    @Test
    public void TestFirstFunctionFor201() throws Exception {
        String req = "<JSON_STRING>";
        when(anotherService.someFunction(Mockito.anyString())).thenReturn("Success");
        this.mockMvc.perform(put("/Main/one/").contentType(MediaType.APPLICATION_JSON)
                .content(req)).andExpect(status().isCreated());
    }
}

当然我必须更改名称。下面是控制器代码:

@PutMapping("/Main/one")
    public ResponseEntity<String> firstFunction(@RequestBody RequestObject requestObject){
        String result = anotherService.someFunction(requestOject.getName());
        if(Objects.equals(result, "Success")){
            return new ResponseEntity<>(result, HttpStatus.CREATED);
        }
        return new ResponseEntity<>(result, HttpStatus.BAD_REQUEST);
    }

所以我模拟firstFunction返回“Success”,但是我没有得到结果。相反,实际的函数正在执行。只有当req是合适的时候,测试用例才通过。换句话说,函数没有被模拟。
请帮帮忙。

laik7k3q

laik7k3q1#

你不需要模拟你想要测试的或者方法。模拟背后的思想是模拟你的依赖项。在你的例子中,你想要测试的类是MainController,它依赖于AnotherServiceImpl。没关系,你已经模拟了你的依赖项,所以你不需要模拟MainController
此外,这里您正在进行一个 * 集成测试 *,因为注解@SpringBootTest将加载您的所有上下文。我猜这不是您在使用MockMvc时所希望的。您必须使用test slice代替注解@WebMvcTest(MainController.class)
您的类应该类似于:

@WebMvcTest(TestMainController.class)
public class TestMainController {

    @MockBean
    AnotherServiceImpl anotherService;

    @Autowired
    private MockMvc mockMvc;

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders.standaloneSetup(mainController).build();
    }

    @Test
    public void TestFirstFunctionFor201() throws Exception {
        String req = "<JSON_STRING>";
        when(anotherService.someFunction(Mockito.anyString())).thenReturn("Success");
        this.mockMvc.perform(put("/Main/one/").contentType(MediaType.APPLICATION_JSON)
                .content(req)).andExpect(status().isCreated());
    }
}

相关问题