如何解决在 Spring Boot 中使用 MockMvc 模拟 DAO 对象
我是集成测试的新手。我有 Spring Integration 应用程序,我正在为其编写测试用例。这是我编写测试用例的方式: 激活器:
@Service
public class ProdAppActivator {
@Autowired
private ApplicantDAO applicantDAO;
@Transactional
public ApplicantDTO prodApp(ApplicantDTO applicant)
throws TechnicalException,BusinessException {
applicantDAO.updateApp(applicant);
return application;
}
}
测试类:
public class AcctImplTest extends AbstractTest {
@MockBean
private ApplicantDAO applicantDAO;
@Override
@Before
public void setUp() {
super.setUp();
}
@Test
public void testProdApp() throws Exception {
ProdAppRequest appRequest = getProdAppRequest();
mvc.perform(post("/baseurl/applicant").headers(getHeaders()).accept(MediaType.APPLICATION_JSON)
.content(mapToJson(appRequest)).contentType(MediaType.APPLICATION_JSON)).andDo(print())
.andExpect(status().isOk());
}
}
抽象测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:group/deposit/svc/product-application-context-test.xml" })
@WebMvcTest
//@IfProfileValue(name ="profiles.active",value ="Integration")
public abstract class AbstractTest {
protected MockMvc mvc;
@Autowired
WebApplicationContext webApplicationContext;
protected void setUp() {
setCMD();
mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
}
我有两个问题:
- 这个激活器有一个带有@Transactional 注释的方法。我不知道为什么,但由于这个注释,我的测试失败并给出错误:
java.lang.ClassLoader.loadClass(ClassLoader.java:424)
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
java.lang.ClassLoader.loadClass(ClassLoader.java:357)
org.springframework.orm.hibernate4.HibernateTransactionManager.isSameConnectionForEntireSession(HibernateTransactionManager.java:711)
org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:445)
org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:378)
org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:474)
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:289)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
com.hsbc.group.depositproduct.us.svc.activators.RecordProdAppActivator$$EnhancerBySpringCGLIB$$d1f3f882.recordProdApp(<generated>)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
当我删除此注释时,一切正常。但我不想删除这个注释,所以请一些人建议如何在这里编写测试。
- 如果我删除@Transactional 注释;我已经使用@MockBean 来模拟 DAO 对象(接口)及其模拟的给定对象,但是当我尝试为任何 DAO 返回预期值时,调用其返回的默认值。有人可以建议如何在使用@MockBean 时模拟 DAO。我尝试过@SpyBean 和其他可能的方法,但没有成功。 提前致谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。