测试方法参数是Generic

时间:2014-04-11 19:12:52

标签: java generics junit mockito

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

public class AbstractServiceClient(){
  public constructBusinessClient(String serviceName, String clientName, Class<? extends AbstractTO> requestClass, AbstractTO serviceRequestTO){
    constructBusinessServicesRestClientProperties(servicename, clientName,  requestClass, servicerequestTO);
  }

//编写一个测试用例来检查扩展AbstractTO的类是否传递给下面的方法(Class requestClass)

 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));
    }   
  }
}

1 个答案:

答案 0 :(得分:0)

这个问题有点太模糊,无法生成代码作为答案,但实质上,如果问题是确保调用类A的方法B,并使用某些参数,当你调用类C的方法D时,通常要做的是以下内容。

  1. 创建一个类B的模拟对象,您将检查其上的交互。
  2. 创建一个真实的对象D,您实际上将要进行测试。
  3. 以某种方式将模拟B注入您的真实对象D。这可以通过D的构造函数完成,在这种情况下,此步骤将成为步骤2的一部分。
  4. 调用方法C,传递所需的任何参数。
  5. 验证方法A是否已被调用,并在模拟对象上使用正确的参数。
  6. 如果方法A的返回值对于类D的工作非常重要,那么它将会像这样工作。

    1. 创建一个类B的模拟对象,您将检查其上的交互。
    2. 创建一个真实的对象D,您实际上将要进行测试。
    3. 以某种方式将模拟B注入您的真实对象D。这可以通过D的构造函数完成,在这种情况下,此步骤将成为步骤2的一部分。
    4. Stub方法A,这样当使用正确的参数调用它时,将返回相应的返回值。
    5. 调用方法C,传递所需的任何参数。
    6. 检查类D的对象的状态,以确保A的返回值对状态产生正确的影响。如果D的状态不正确,则D未正确处理返回,或者从未调用方法A,或者调用方法A时出错参数。
    7. 在第二种情况下,不需要验证模拟以及存根。嘲笑的纯粹主义者会告诉你,你应该存根或验证,但不要两者兼而有之。

      现在,看一下你问题中的代码,我觉得你完成了任何必要的步骤。所以这个&#34;测试用例&#34;不会做任何事情。即使你认为&#34;它有效,但你还没有测试任何东西。

      就Mockito的使用而言,您将使用与匹配器EITHER的方法调用来存根方法,或者验证它;因此,您的代码可用于我上面描述的两种情况中的任何一种。

      但你必须做其中一个。因此,如果您要进行验证,可以编写

      verify(mockAbstractServiceClient).constructBusinessServicesRestClientProperties(anyString(), eq(CLIENT_NAME), eq(SomeConcreteTO.class), any(AbstractTO.class));
      

      或者如果你正在抄写,你可以写

      doReturn(someValue).when(mockAbstractServiceClient).constructBusinessServicesRestClientProperties( anyString(), eq(CLIENT_NAME), eq(SomeConcreteTO.class), any(AbstractTO.class));
      

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

      请注意,在这两个版本中,我在eq对象周围使用了Class。这是如何检查这是传递给方法的类。