无法无名为httpservletresponse



我可以在控制器中使用@Autowired

@RestController
public class Index {
    @Autowired
    HttpServletResponse response;
    @GetMapping("/")
    void index() throws IOException {
        response.sendRedirect("http://example.com");
    }
}

它有效;

但是,当我尝试使用@mockbean like

测试此课程时
@RunWith(SpringRunner.class)
@SpringBootTest
public class IndexTest {
    @Autowired
    Index index;
    @MockBean
    HttpServletResponse response;
    @Test
    public void testIndex() throws IOException {
        index.index();
    }
}

它引发了例外,说

Description:
Field response in com.example.demo.Index required a single bean, but 2 were found:
    - com.sun.proxy.$Proxy69@425d5d46: a programmatically registered singleton  - javax.servlet.http.HttpServletResponse#0: defined in null

Action:
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

如何修复它?

虽然恕我直言,但它是一个不好的习惯,是这样注入 HttpServletResponseHttpServletRequest。这将导致奇怪的问题,并且看起来很奇怪,也就是错误的。而是使用类型HttpServletResponse的方法参数并使用Spring MockHttpServletResponse进行测试。

然后编写单元测试就像创建类的新实例并调用该方法一样简单。

public class IndexTest {
    private Index index = new Index();
    @Test
    public void testIndex() throws IOException {
        MockHttpServletResponse response = new MockHttpServletResponse();
        index.index(response);
        // Some assertions on the response. 
    }
}

如果要作为较大集成测试的一部分进行测试,则可以或多或少地执行相同的操作,但使用@WebMvcTest注释。

@RunWith(SpringRunner.class)
@WebMvcTest(Index.class)
public class IndexTest {
    @Autowired
    private Index index;
    @Test
    public void testIndex() throws IOException {
        MockHttpServletResponse response = new MockHttpServletResponse();
        index.index(response);
        // Some assertions on the response. 
    }
}

或使用MockMvc用模拟请求进行测试

@RunWith(SpringRunner.class)
@WebMvcTest(Index.class)
public class IndexTest {
    @Autowired
    private MockMvc mockMvc;
    @Test
    public void testIndex() throws IOException {
        mockMvc.perform(get("/")).
            andExpect(status().isMovedTemporarily());
        MockHttpServletResponse response = new MockHttpServletResponse();
        index.index(response);
        // Some assertions on the response. 
    }
}

上面的测试也可以使用@SpringBootTest的差异编写,是@WebMvcTest仅测试和引导Web Slice(即与Web相关的内容),而@SpringBootTest实际上将启动整个应用程序。

第一件事:junits不是为控制器编写的。

代码问题 -

  1. 您有多个Index类型的豆子,或者您有多个HttpServletResponse的豆。@Autowired@MockBean都按类型不名检查。
  2. HttpServletResponse更多是DTO,因此应使用@Mock嘲笑它。

相关内容

  • 没有找到相关文章

最新更新