我们如何测试将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));
}
}
}
答案 0 :(得分:0)
这个问题有点太模糊,无法生成代码作为答案,但实质上,如果问题是确保调用类A
的方法B
,并使用某些参数,当你调用类C
的方法D
时,通常要做的是以下内容。
B
的模拟对象,您将检查其上的交互。D
,您实际上将要进行测试。D
。这可以通过D
的构造函数完成,在这种情况下,此步骤将成为步骤2的一部分。C
,传递所需的任何参数。A
是否已被调用,并在模拟对象上使用正确的参数。如果方法A
的返回值对于类D
的工作非常重要,那么它将会像这样工作。
B
的模拟对象,您将检查其上的交互。D
,您实际上将要进行测试。D
。这可以通过D
的构造函数完成,在这种情况下,此步骤将成为步骤2的一部分。A
,这样当使用正确的参数调用它时,将返回相应的返回值。C
,传递所需的任何参数。D
的对象的状态,以确保A
的返回值对状态产生正确的影响。如果D
的状态不正确,则D
未正确处理返回,或者从未调用方法A
,或者调用方法A
时出错参数。在第二种情况下,不需要验证模拟以及存根。嘲笑的纯粹主义者会告诉你,你应该存根或验证,但不要两者兼而有之。
现在,看一下你问题中的代码,我觉得你完成了任何必要的步骤。所以这个&#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));
当然,使用when
和thenReturn
还有另一种写法,但我发现使用doReturn
更直观。
请注意,在这两个版本中,我在eq
对象周围使用了Class
。这是如何检查这是传递给方法的类。