Java JUnit测试中的模拟构建器
假设我有一个测试,它使用构建器来构造对象。问题是builder类中的builder()方法是静态的 通常,模仿静态方法已经是糟糕设计的标志。但是,对于构建器,builder()方法始终是静态的。使用builders()进行单元测试的最佳方法是什么?是否应该将构建器重构为一个单独的类以便于模拟Java JUnit测试中的模拟构建器,java,junit,Java,Junit,假设我有一个测试,它使用构建器来构造对象。问题是builder类中的builder()方法是静态的 通常,模仿静态方法已经是糟糕设计的标志。但是,对于构建器,builder()方法始终是静态的。使用builders()进行单元测试的最佳方法是什么?是否应该将构建器重构为一个单独的类以便于模拟 class Service { private SqsClient sqsClient; private String sqsQueueUrl; public Service(S
class Service {
private SqsClient sqsClient;
private String sqsQueueUrl;
public Service(String sqsQueueUrl) {
this.sqsClient = SqsClient.builder().build();
this.sqsQueueUrl = sqsQueueUrl;
}
public SqsClient getClient() {
return this.client;
}
public SqsClient setClient(SqsClient client) {
this.client = client;
}
public String getSqsQueueUrl() {
return this.sqsQueueUrl;
}
public void setSqsQueueUrl(String sqsQueueUrl) {
this.sqsQueueUrl = sqsQueueUrl;
}
public void onEvent(Activity activity) {
// How to mock builders in unit test?
DeleteMessageRequest deleteRequest = DeleteMessageRequest.builder().queueUrl(this.sqsQueueUrl).receiptHandle(activity.getReceiptHandle()).build();
DeleteMessageResponse deleteMessageResponse = this.sqsClient.deleteMessage(deleteRequest);
}
}
class ServiceTest {
@Test
public void testEvent() {
String sqsQueueUrl = "http://127.0.0.1";
String receiptHandle = "asdasd";
SqsClient sqsClient = EasyMock.mock(SqsClient.class);
Service service = EasyMock.mock(Service.class);
// EasyMock expect and replay here.
service.setClient(sqsClient);
service.setSqsQueueUrl(sqsQueueUrl);
Activity activity1 = new Activity();
activity.setReceiptHandle(receiptHandle);
service.onEvent(activity);
}
}
您可以通过依赖注入
SqsClient
@chrylis onstrike-依赖注入SqsClient不能解决builder()模拟问题。是的,它可以:您不在类内使用builder
,您可以模拟SqsClient
实例。@chrylis onstrike Ok,SqsClient可能就是这样,但是DeleteMessageRequest呢?依赖注入DeleteMessageRequest没有意义,因为它在每个事件中都是唯一的。您可以通过依赖注入SqsClient
@chrylis onstrike-依赖注入SqsClient不能解决builder()模拟问题。是的,它可以:您不在类中使用builder
,您可以模拟SqsClient
实例。@chrylis onstrike好的,SqsClient可能就是这样,但是DeleteMessageRequest呢?依赖注入DeleteMessageRequest没有意义,因为它是每个事件唯一的。