gpt4 book ai didi

java - 使用独立上下文和 SpringBoot 1.2.5 的 MockMvcBuilders 进行文件上传的单元测试

转载 作者:行者123 更新时间:2023-11-30 03:17:08 26 4
gpt4 key购买 nike

我正在使用 Spring Boot 1.2.5-RELEASE。我有一个接收 MultipartFileString

的 Controller
@RestController
@RequestMapping("file-upload")
public class MyRESTController {

@Autowired
private AService aService;

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ResponseStatus(HttpStatus.CREATED)
public void fileUpload(
@RequestParam(value = "file", required = true) final MultipartFile file,
@RequestParam(value = "something", required = true) final String something) {
aService.doSomethingOnDBWith(file, value);
}
}

现在,该服务运行良好。我用 PostMan 测试了它,一切都按预期进行。不幸的是,我无法为该代码编写独立的单元测试。当前的单元测试是:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyApplication.class)
@WebAppConfiguration
public class ControllerTest{

MockMvc mockMvc;

@Mock
AService aService;

@InjectMocks
MyRESTController controller;

@Before public void setUp(){
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
}

@Test
public void testFileUpload() throws Exception{
final File file = getFileFromResource(fileName);
//File is correctly loaded
final MockMultipartFile multipartFile = new MockMultipartFile("aMultiPartFile.txt", new FileInputStream(file));

doNothing().when(aService).doSomethingOnDBWith(any(MultipartFile.class), any(String.class));

mockMvc.perform(
post("/file-upload")
.requestAttr("file", multipartFile.getBytes())
.requestAttr("something", ":(")
.contentType(MediaType.MULTIPART_FORM_DATA_VALUE))
.andExpect(status().isCreated());
}
}

测试失败

java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?

现在,在 Spring Boot 的 MultipartAutoConfiguration 类中,我看到 MultipartResolver 是自动配置的。但是,我想使用 MockMvcBuildersstandaloneSetup 我无法访问它。

我尝试了几种单元测试配置,为简洁起见,我没有报告这些配置。特别是,我也尝试过放心如图here ,但老实说这不起作用,因为我似乎无法模拟 AService 实例。

有什么解决办法吗?

最佳答案

您正在尝试将此处的单元测试 ( standaloneSetup(controller).build(); ) 与 Spring 集成测试 ( @RunWith(SpringJUnit4ClassRunner.class) ) 结合起来。

选择其中之一。

  1. 集成测试需要使用类似下面的代码。问题在于 bean 的伪造。有很多方法可以用 @Primary 来伪造这样的bean。注释和 @Profile注释(您创建将覆盖主生产 bean 的测试 bean)。我有一些伪造 Spring beans 的例子(例如 this beanthis bean 中被 this test 替换)。

    @Autowired
    private WebApplicationContext webApplicationContext;

    @BeforeMethod
    public void init() {
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }
  2. 第二个选项是删除 @RunWith(SpringJUnit4ClassRunner.class)以及测试和测试 Controller 上的其他类级别配置,无需独立设置的 Spring Context。这样您就无法在 Controller 上测试验证注释,但可以使用 Spring MVC 注释。优点是可以通过 Mockito 伪造 beans(例如通过 InjectMocks 和 Mock 注释)

关于java - 使用独立上下文和 SpringBoot 1.2.5 的 MockMvcBuilders 进行文件上传的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32293550/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com