当前位置: 首页 > 知识库问答 >
问题:

控制器类中模拟的服务层正在执行实际的方法实现

苏高峰
2023-03-14

在为控制器类编写单元测试用例时,我模拟了服务层调用以返回所需的值,但相反,它返回 null。

@RunWith(SpringJUnit4ClassRunner.class)
    public class ControllerTest {

        @Mock
        private Service serviceMock;

        @InjectMocks
        private Controller controller;

        private MockMvc mockMvc;

        /**
         * Sets the up.
         *
         * @throws Exception the exception
         */
        @Before
        public void setUp() throws Exception {
            MockitoAnnotations.initMocks(this);
            mockMvc = 
    MockMvcBuilders.standaloneSetup(controller).build();
        }

        @Test
        public void method1() throws Exception {
            when(this.serviceMock.associateTag(any(Request.class), null))
            .thenReturn(Responses.SUCCESS);
    mockMvc.perform(post("/tag/assign").contentType(MediaType.APPLICATION_JSON).content(request))               .andExpect(MockMvcResultMatchers.status().isOk());
        }
@PostMapping("/assign")
public RestResponse assignTag(@RequestBody final TagAssociation 
tagAssociation) {
final TagResponses serviceResponse = 
this.service.associateTag(tagOrderAssociation, null);  

serviceResponse总是null,我期待一个枚举响应Responses.SUCCESS

testException=org.springframework.web.util。NestedServletException:请求处理失败;嵌套异常是java.lang.NullPointerException

服务层有许多自动连接的依赖项。我也需要嘲笑它吗?无法找出失败的确切原因。

共有1个答案

越鸿才
2023-03-14

当您在存根时使用匹配器时,您必须对所有输入参数使用它们。所以试试:

when(this.serviceMock.associateTag(Mockito.any(Request.class), Mockito.eq(null)))

如果你想进一步阅读,那么我写了这篇文章

 类似资料:
  • 我有一个Spring 3.2 MVC应用程序,正在使用Spring MVC测试框架测试控制器动作的GET和POST请求。我使用Mockito来模拟服务,但我发现模拟被忽略了,我的实际服务层被使用了(因此,数据库被击中)。 控制器测试中的代码: 你会注意到我有两个上下文配置文件;这是一种黑客行为,因为如果我无法阻止控制器测试命中实际的服务层,那么该服务层的存储库也可能指向测试数据库。我再也不能忍受这

  • 我试图在Spring boot 2中编写一个测试类,其中: 我想测试一个控制器 我想嘲笑一个仓库 我想按原样注入一个服务(即不嘲笑它) 该类看起来像: 的(唯一)实现是用注释的,并允许通过其构造函数注入仓库: 运行测试时,我得到了一个,大致上说是“没有可用”。 我怀疑我可能需要一个特定的测试配置来获得服务,但是我被可用的在线文献弄糊涂了。 有指针吗?

  • 当我测试模拟外部调用时,我没有看到报告的模拟值,而是,并且我的测试失败。我可以在测试类中看到模拟值(报告),但在类中看不到,并且应用程序(方法返回)没有像我预期的那样被修改。 我的期望是:当我在Impl类中模拟外部调用时,模拟值应该在那里可用,其余的一切都会发生,就好像调用了真正的方法来完成单元测试一样。 实现代码: 测试代码:

  • 我正在寻找一种方法来模拟Controller中使用的服务bean,这样我就可以使用MockMVC只测试Controller。但是我找不到一个简单的方法来用Spock Mock代替real bean。一切都使用spring-boot 1.3.2版本。更多细节如下: 我有一个以下控制器类 和集成Spock测试: 我需要一种方法来替换这个autowired bean,用一个mock/stub这样我就可以

  • 问题内容: 我的[基本] Spring Boot应用程序接受来自浏览器的请求,通过发送,并应立即收到响应-例如“ 您的请求已排队 ”。为此,我编写了一个控制器: 本类实现一个接口,是很简单的。它只有一种方法可以执行耗时的任务。我不需要此服务呼叫返回的任何内容,因为无论工作失败还是成功,都会在工作结束时发送一封电子邮件。因此它实际上看起来像: 我以为这样可以,但是浏览器的Ajax请求在返回响应之前等

  • 我的[基本]spring boot应用程序接受来自浏览器的请求,通过发送,并且应该立即收到响应--比如“您的请求已排队”。为了实现这一点,我编写了一个控制器: 类实现了接口,非常简单。它只有一个方法来执行一个耗时的任务。我不需要从这个服务调用返回的任何东西,因为一封电子邮件将在工作结束时传递,无论是失败还是成功的场景。因此它实际上看起来像: 我原以为这会起作用,但浏览器的Ajax请求在返回响应之前