JUnit方案 DetachedCriteria模拟求解

    新项目客户对测试的要求比较严格,要求单元测试的覆盖率为全部Java代码,所以问题就来了。
    框架采用的仍然是Struts+Spring+Hibernate
    1.Dao测试
       这个没什么好说的,使用Spring-mock测试,直接连接数据库模拟真实环境,在开发中即时检验配置文件和代码的正确性。
    2.Service层的测试
       以往的测试没有对Dao进行mock,这样测试的缺点是效率低,每次测试都要跑Spring Context,而且不能脱离Dao达到测试业务逻辑的目的,所以目前尝试使用EasyMock,但是问题出现在Hibernate DetachedCriteria的使用上,就是我无法正确模拟DC,示例代码如下:
      
      Service层:
     
java 代码
 
  1. private Dao dao;
  2. public setDao(Dao dao){
  3.    this.dao = dao;
  4. }
  5. public void serviceMethod(String id) {  
  6.         // 构造查询条件  
  7.         DetachedCriteria dc = DetachedCriteria.forClass(Dao.class);  
  8.         dc.add(Restrictions.eq("id", Long.parseLong(id)));
  9.   
  10.         List resultList = new ArrayList();  
  11.         try {  
  12.             resultList = dao.findModelById(dc);  
  13.         } catch (Exception e) { 
  14.            //TODO
  15.         } 
  16.     }  
     测试代码:MockServiceTest.java
java 代码
 
  1. public void testFindById() {  
  2.     dao = createMock(Dao.class);  
  3.     serviceImpl.setDao(dao);  
  4.   
  5.     DetachedCriteria dc = EasyMock.createMock(DetachedCriteria.class);  
  6.     dao.findModelById(dc);  
  7.   
  8.     expectLastCall().andReturn(new ArrayList());  
  9.     replay(dao);  
  10.   
  11.     String id = "1";  
  12.     try {  
  13.         Model model = serviceImpl.serviceMethod(id);  
  14.         assertNotNull(department);  
  15.     } catch (Exception be) {  
  16.         be.printStackTrace();  
  17.         assertTrue(false);  
  18.     }  
  19.   
  20.     verify(dictDao);  
  21. }  
这里就出现问题了,在MockServiceTest中模拟Dao是可以的,但是由于这个Dao方法findModelById需要一个参数DetachedCriteria,我试过很多方法模拟都不奏效,出现的错误都是:
java 代码
 
  1. java.lang.AssertionError:   
  2.   Unexpected method call findModelById(DetachableCriteria(CriteriaImpl(com.test.model.Model:this[][id=1]))):  
  3.     findAllByCriteria(EasyMock for class org.hibernate.criterion.DetachedCriteria): expected: 1, actual: 0  
  4.     at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:29)  
  5.     at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:45)  
  6.     at $Proxy0.findAllByCriteria(Unknown Source)  
说是这个Dao方法不是预期被调用德方法,我试过其他的方法,如果参数是普通变量都没有问题,就是用了DC不行,所以我的问题就是DetachedCriteria真的无法模拟?如果可以用什么模拟? 具体方法?
     3.Web Layer层测试:
        由于Struts本身就很难于测试,起初选用StrutsTestCase测试,由于采用Spring托管的方式,所以必须在测试的过程中首先注入一个Spring的plugin-in,具体方法是在http://www.jetmaven.net/contents/documents/index.php找到的,但是原本貌似被删除了。
     使用StrutsTestCase有几个问题:使用StrutsTestCase测试非常笨重,而且MockStrutsTestCase模拟的也不是很好,而且不大好分离测试。所以也考虑采用EasyMock来测试(网上有很多人推荐这种方式),但是并没有找到相应的实例,并且也有与上面相同的DetachedCriteria的问题。
    综上,在这里求教单元测试使用EasyMock或者其他方法测试Struts、模拟DetachedCriteria的方案,谢谢。
您好!对于模拟 Jackson 的 JsonParseException,您可以使用 JUnitMockito 来进行模拟测试。下面是一个示例代码: 首先,您需要导入所需的依赖项(JUnitMockito 和 Jackson): ```xml <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>3.12.4</version> <scope>test</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.13.0</version> </dependency> ``` 然后,您可以编写一个测试类来模拟 JsonParseException: ```java import com.fasterxml.jackson.core.JsonParseException; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import java.io.IOException; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class JsonParseExceptionTest { @Mock private JsonParseException jsonParseException; @Test(expected = JsonParseException.class) public void testJsonParseException() throws IOException { when(jsonParseException.getMessage()).thenReturn("Invalid JSON"); throw jsonParseException; } } ``` 在上面的示例中,我们使用了 Mockito 来创建一个模拟的 JsonParseException 对象,并通过 `when` 方法指定了当调用 `getMessage` 方法时返回的消息内容。然后,通过抛出该模拟对象来模拟 JsonParseException 的发生。 最后,使用 `@RunWith(MockitoJUnitRunner.class)` 注解来运行测试,并使用 `@Test(expected = JsonParseException.class)` 注解来指定期望抛出 JsonParseException 异常。 这样,当执行测试时,将会抛出模拟的 JsonParseException 异常,并且其消息内容为 "Invalid JSON"。 希望能帮到您!如果您有任何其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值