我有一个SpringBoot REST API连接到Oracle DB。
我的控制器调用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,但是没有按预期工作。