Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JUnit测试中的模拟构建器_Java_Junit - Fatal编程技术网

Java JUnit测试中的模拟构建器

Java JUnit测试中的模拟构建器,java,junit,Java,Junit,假设我有一个测试,它使用构建器来构造对象。问题是builder类中的builder()方法是静态的 通常,模仿静态方法已经是糟糕设计的标志。但是,对于构建器,builder()方法始终是静态的。使用builders()进行单元测试的最佳方法是什么?是否应该将构建器重构为一个单独的类以便于模拟 class Service { private SqsClient sqsClient; private String sqsQueueUrl; public Service(S

假设我有一个测试,它使用构建器来构造对象。问题是builder类中的builder()方法是静态的

通常,模仿静态方法已经是糟糕设计的标志。但是,对于构建器,builder()方法始终是静态的。使用builders()进行单元测试的最佳方法是什么?是否应该将构建器重构为一个单独的类以便于模拟

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没有意义,因为它是每个事件唯一的。