gpt4 book ai didi

java - 通用的测试方法参数

转载 作者:太空宇宙 更新时间:2023-11-04 14:57:32 25 4
gpt4 key购买 nike

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

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

//编写一个测试用例来检查扩展AbstractTO的类是否传递给下面的方法(类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));
}
}
}

最佳答案

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

  1. 创建 B 类的模拟对象,您将在其上检查交互。
  2. 创建一个 D 类的真实对象,您将实际测试它。
  3. 以某种方式将模拟 B 注入(inject)到真实对象 D 中。这可以通过 D 的构造函数来完成,在这种情况下,此步骤将成为步骤 2 的一部分。
  4. 调用方法 C,传递所需的任何参数。
  5. 验证是否调用了方法 A,并在模拟对象上使用了正确的参数。

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

  1. 创建 B 类的模拟对象,您将在其上检查交互。
  2. 创建一个 D 类的真实对象,您将实际测试它。
  3. 以某种方式将模拟 B 注入(inject)到真实对象 D 中。这可以通过 D 的构造函数来完成,在这种情况下,此步骤将成为步骤 2 的一部分。
  4. stub 方法 A,这样当使用正确的参数调用它时,就会返回适当的返回值。
  5. 调用方法 C,传递所需的任何参数。
  6. 检查 D 类对象的状态,以确保 A 的返回值对状态产生了正确的影响。如果 D 的状态不正确,则要么 D 未正确处理返回,要么从未调用方法 A,或者方法 A 被调用时使用了错误的参数。

在第二种情况下,无需验证模拟并对其进行 stub 。 mock 的纯粹主义者会告诉您,您应该 stub 或验证,但决不能两者兼而有之。

现在,看看您问题中的代码,在我看来您没有完成任何必需的步骤。所以这个“测试用例”不会做任何事情。即使您认为“它有效”,您也没有测试过任何东西。

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

但你必须选择其中之一。因此,如果您正在验证,您可能会写

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

或者如果你正在 stub ,你可能会写

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

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

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

关于java - 通用的测试方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23020817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com