首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >泛型的测试方法参数

泛型的测试方法参数
EN

Stack Overflow用户
提问于 2014-04-12 03:12:52
回答 1查看 90关注 0票数 1

我们如何测试将泛型作为方法参数的方法参数。

代码语言:javascript
运行
复制
public class AbstractServiceClient(){
  public constructBusinessClient(String serviceName, String clientName, Class<? extends AbstractTO> requestClass, AbstractTO serviceRequestTO){
    constructBusinessServicesRestClientProperties(servicename, clientName,  requestClass, servicerequestTO);
  }

//编写测试用例,检查扩展AbstractTO的类是否传给了下面的方法(requestClass类)

代码语言:javascript
运行
复制
 public BusinessServicesRestClient constructBusinessServicesRestClientProperties(String serviceName,String  clientName, Class<? extends AbstractTO> requestClass
       , AbstractTO serviceRequestTO){
      //set values
    }
  }

   public class AbstractServiceClientTest {

    private Class<? extends AbstractTO> requestClass;  
    private static final String CLIENT_NAME = "clientName";
    private  AbstractTO serviceRequestTO ;
    private AbstractServiceClient abstractServiceClient;

 @Test
public void constructBusinessServiceClientShouldSetCorrectClientName() {
abstractServiceClient.constructBusinessClient(operation,clientName, requestClass,  abstractClass);          
abstractServiceClient.constructBusinessServicesRestClientProperties(any(String.class), eq(CLIENT_NAME), requestClass, any(AbstractTO.class));
    }   
  }
 @Test
 public void constructBusinessServiceClientShouldSetCorrectRequestClass() {
abstractServiceClient.constructBusinessClient(operation,clientName, requestClass,  abstractClass);          
abstractServiceClient.constructBusinessServicesRestClientProperties(any(String.class), eq(CLIENT_NAME), eq(requestClass), any(AbstractTO.class));
    }   
  }
}
EN

回答 1

Stack Overflow用户

发布于 2014-04-12 10:58:40

这个问题有点模糊,无法生成代码作为答案,但本质上,如果问题是要确保在调用类B的方法C时,使用某些参数调用类D的方法A,则通常要做的事情如下所示。

  1. 创建一个B类的模拟对象,你将在它上面检查交互。
  2. 创建一个D类的真实对象,你实际上要把你的模拟B注入到你的真实对象D中。这可以通过D的构造函数来完成,在这种情况下,此步骤将是步骤2的一部分。
  3. 调用方法C,将调用方法A的任何参数与您的模拟对象上的正确参数一起传递。

如果方法A的返回值对于类D的工作很重要,那么它将像这样工作。

  1. 创建一个B类的模拟对象,你将在它上面检查交互。
  2. 创建一个D类的真实对象,你实际上要把你的模拟B注入到你的真实对象D中。这可以通过returned.
  3. Call的构造函数来完成,在这种情况下,这一步将是第二步的一部分。
  4. 存根方法A,因此当使用正确的参数调用它时,适当的返回值是returned.
  5. Call方法D,传递任何参数required.
  6. Check你的类A的对象的状态,以确保来自A的返回值对状态有正确的影响。如果D的状态不正确,则说明D未正确处理返回,或者从未调用过A方法,或者使用错误的参数调用了A方法。

在第二种情况下,既不需要验证mock,也不需要清除它。嘲笑纯粹主义者会告诉你,你应该要么存根,要么验证,但永远不能两者兼而有之。

现在,看看你问题中的代码,在我看来,你似乎没有完成任何必要的步骤。所以这个“测试用例”不会做太多的事情。即使你认为“它可以工作”,你也没有测试过任何东西。

就Mockito的使用而言,您可以使用带匹配器的方法调用来存根或验证方法;因此,您的代码可以用于上面描述的两种场景中的任何一种。

但你必须做一个或另一个。所以如果你要验证,你可以写

代码语言:javascript
运行
复制
verify(mockAbstractServiceClient).constructBusinessServicesRestClientProperties(anyString(), eq(CLIENT_NAME), eq(SomeConcreteTO.class), any(AbstractTO.class));

或者,如果您使用的是stubbing,您可以这样写

代码语言:javascript
运行
复制
doReturn(someValue).when(mockAbstractServiceClient).constructBusinessServicesRestClientProperties( anyString(), eq(CLIENT_NAME), eq(SomeConcreteTO.class), any(AbstractTO.class));

当然,还有另一种编写方法,使用whenthenReturn,但我发现使用doReturn更直观。

请注意,在这两个示例中,我都对Class对象使用了eq。这就是如何检查这是不是传递给方法的类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23020817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档