spring-boot - 如何在 Spring Boot REST Junit 测试用例中注入具有多个对象的 MockMvc
问题描述
我有一个连接到 Oracle DB 的 SpringBoot REST API。
我的控制器调用 BusinessImpl 层,然后 BusinessImpl 调用多个 DAO 层(Controller -> BusinessImpl -> DAO1, DAO2, DAO3
)
以下测试用例完美运行
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration()
@TestPropertySource("classpath:dev-manifest.yml")
@ContextConfiguration(classes = Application.class)
@ConfigurationProperties(prefix = "env")
@SpringBootTest
public class MyTest
{
private static final String REQUEST_URI = "/v1/registration/accounts/links";
private MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(),
MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8"));
private MockMvc mockMvc;
@Autowired
private WebApplicationContext webApplicationContext;
@Before
public void setup()
{
this.mockMvc = webAppContextSetup(webApplicationContext).build();
}
@Test
public void testSave()
{
String testInput = "some json input";
mockMvc.perform(post(REQUEST_URI).content(testInput).contentType(contentType))
.andExpect(status().isOk());
}
但我不想在 junit 测试用例期间访问真实数据库。所以我写了一个模拟。
工作代码
@Mock
private SecurityAuditDAO securityAuditDAO;
@InjectMocks
private RegistrationBusinessImpl registrationBusinessImpl;
@Test
public void testSave()
{
when(securityAuditDAO.getState(Mockito.any())).thenReturn("somestring");
SomeRequest someRequest = new SomeRequest();
someRequest.setStatus("SUCCESS");
SomeResponse status = registrationBusinessImpl.createUser(SomeRequest, "127.0.0.1");
}
上面的代码完美运行。在 businessImpl 类 securityAuditDAO.getState 中返回“somestring”。但是当我介绍 mockMvc.perform 它停止工作。
不工作
@Test
public void testSave()
{
when(securityAuditDAO.getState(Mockito.any())).thenReturn("somestring");
String testInput = "some json input";
mockMvc.perform(post(REQUEST_URI).content(testInput).contentType(contentType))
.andExpect(status().isOk());
}
上面的代码仍在访问数据库。所以我意识到我应该用 securityAuditDAO 注入 mockMvc 所以我添加了以下行
this.mockMvc = MockMvcBuilders.standaloneSetup(securityAuditDAO).build();
代码
private MockMvc mockMvc;
@Autowired
private WebApplicationContext webApplicationContext;
@Mock
private SecurityAuditDAO securityAuditDAO;
@InjectMocks
private RegistrationBusinessImpl registrationBusinessImpl;
@InjectMocks
RegistrationApiController registrationApiController;
@Before
public void setup()
{
MockitoAnnotations.initMocks(this);
//this.mockMvc = webAppContextSetup(webApplicationContext).build();
this.mockMvc = MockMvcBuilders.standaloneSetup(securityAuditDAO).build();
//this.mockMvc = MockMvcBuilders.standaloneSetup(registrationApiController).build();
//ReflectionTestUtils.setField(mockMvc, "securityAuditDAO", securityAuditDAO);
}
我尝试注入 securityAuditDAO。但如果我这样做,我在 BusinessImpl 中的其他自动装配实例为空。如何在不影响其他人的情况下注入 securityAuditDAO,或者如何同时注入 webApplicationContext 和 securityAuditDAO。还尝试了 ReflectionTestUtils.setField 但它没有按预期工作。
解决方案
推荐阅读
- powershell - Powershell 文件行以“字符串”开头,以“整数”结尾
- python - 在 python 中使用多级 JSON/dict/Template 推进字符串/JSON 格式化
- python-3.x - 为什么我在 Jupyter 笔记本中导入 CSV 文件时看到此错误?
- swift - 如何在 Swift 5 中使用 Alamofire 5 发布包含用户数据的请求
- awk - 如果发现模式,awk 或 sed 或其他文件管理工具会删除某些行
- sql - 选择 Tier 值与上一行不同的行。按帐户编号和日期排序
- excel - 如何使用 Excel 根据条件从数组中获取范围
- python - for循环的输出有问题吗?
- javascript - 无法导入模块。一直告诉我找不到模块
- excel - 如果 Excel 中的条件公式不起作用