Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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 SpringBoot RestController的Spock测试和异常模拟_Java_Spring_Spring Boot_Groovy_Spock - Fatal编程技术网

Java SpringBoot RestController的Spock测试和异常模拟

Java SpringBoot RestController的Spock测试和异常模拟,java,spring,spring-boot,groovy,spock,Java,Spring,Spring Boot,Groovy,Spock,我对groovy测试RestController for spring引导应用程序的方法还不熟悉。我有一个控制器类: @RestController @请求映射(value=“/onboarding/v1”) 公共类车载控制器{ 私有静态最终记录器LOG=LoggerFactory.getLogger(OnboardingServiceImpl.class); @自动连线 私人登机服务登机服务; @请求映射( value=“/service models”, method=RequestMeth

我对groovy测试RestController for spring引导应用程序的方法还不熟悉。我有一个控制器类:

@RestController
@请求映射(value=“/onboarding/v1”)
公共类车载控制器{
私有静态最终记录器LOG=LoggerFactory.getLogger(OnboardingServiceImpl.class);
@自动连线
私人登机服务登机服务;
@请求映射(
value=“/service models”,
method=RequestMethod.POST,
使用={“多部分/表单数据”},
生成={“应用程序/json”}
)
公共响应createServiceModel(
@RequestParam(“名称”)最终字符串名称,
@RequestParam(“文件”)最终多部分文件
){
试一试{
最终ServiceModelRequestData ServiceModelRequestData=
新ServiceModelRequestData(名称、文件);
最终ServiceModelDetail createdServiceModel=
onboardingService.createServiceModel(serviceModelRequestData);
返回新的ResponseEntity(createdServiceModel,HttpStatus.OK);
}
捕获(格式错误的内容异常){
日志错误(“格式错误的内容:”,ex);
返回新的响应属性(errorMessage(ex)、HttpStatus.BAD_请求);
}
捕获(ServiceModelNameReadyExistsException ex){
LOG.error(“服务模型名称已存在:”,ex);
返回新的响应属性(errorMessage(ex)、HttpStatus.CONFLICT);
}
捕获(ServiceUnavailableException ex){
日志错误(“当前服务不可用:+ex”);
返回新的响应属性(errorMessage(ex),HttpStatus.SERVICE_不可用);
}
}
//...
}
我无法找到如何在编写异常的spock测试用例和检查所需响应的同时对上述类进行spock测试?我想创建一个测试用例,在调用该方法时抛出一个错误,并返回我要检查的responseentity,其中包含给定的Jason数据和所需的Http状态。非常感谢代码片段的示例spock测试

编辑: 测试类如下(以及我尝试做的评论):

我的服务级别如下:

package com.service.onboarding.business;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.service.onboarding.business.api.OnboardingService;
import com.service.onboarding.business.servicemanagement.ServiceModelRepository;
import com.service.onboarding.domain.exception.MalformedContentException;
import com.service.onboarding.domain.exception.ServiceModelDoesNotExistException;
import com.service.onboarding.domain.exception.ServiceModelInUseException;
import com.service.onboarding.domain.exception.ServiceModelNameAlreadyExistsException;
import com.onboarding.domain.exception.ServiceUnavailableException;
import com.service.onboarding.domain.requestdata.ServiceModelPaginationFilter;
import com.service.onboarding.domain.requestdata.ServiceModelRequestData;
import com.service.onboarding.domain.resource.Greeting;
import com.service.onboarding.domain.resource.ServiceModel;
import com.service.onboarding.domain.resource.ServiceModelDetail;
import com.service.onboarding.domain.responsedata.PaginatedServiceResponseData;

/*
 * Sample service to demonstrate what the API would use to get things done
 */
@Service
public class OnboardingServiceImpl implements OnboardingService {

    private final AtomicLong counter = new AtomicLong();

    private static final String TEMPLATE = "Hello, %s!";

    private static final Logger LOG = LoggerFactory.getLogger(OnboardingServiceImpl.class);

    @Autowired
    private ServiceModelRepository serviceModelRepository;


    public OnboardingServiceImpl() {
    }

    @Override
    public Greeting getPersonalGreeting(final String name) {
        return new Greeting(counter.incrementAndGet(),
                String.format(TEMPLATE, name));
    }
 @Override
    public ServiceModelDetail createServiceModel(final ServiceModelRequestData serviceModelRequestData) throws MalformedContentException, ServiceModelNameAlreadyExistsException, ServiceUnavailableException {
        return serviceModelRepository.create(serviceModelRequestData);
    }

您的测试应该如下所示:

package de.scrum\u master.stackoverflow
导入org.springframework.http.ResponseEntity
导入org.springframework.web.multipart.MultipartFile
导入spock.lang.Specification
导入spock.lang.Unroll
导入静态org.springframework.http.HttpStatus*
类OnboardingControllerTest扩展了规范{
OnboardingService=新的OnboardingService()
车载控制器
反应性反应
@展开
定义“HTTP响应#创建服务模型时的状态代码”(){
鉴于:
如果(例外){
服务=存根(){
createServiceModel()>>{抛出异常}
}
}
控制器=新的OnboardingController(onboardingService:service)
什么时候:
响应=controller.createServiceModel(“测试”,模拟(多部分文件))
然后:
response.statusCode==statusCode
哪里:
异常|状态代码
空|好
新的格式错误的ContentException()|请求错误
新ServiceModelNameReadyExistsException()|冲突
新ServiceUnavailableException()|服务不可用
}
}
控制台日志(我在复制您的用例时切换到Java日志记录)将是:

Mär 10201812:51:50 PM de.scrum_master.stackoverflow.OnboardingController createServiceModel
信息:格式错误的内容:de.scrum\u master.stackoverflow.MalformedContentException
2018年12月10日下午12:51:50 de.scrum_master.stackoverflow.OnboardingController createServiceModel
信息:服务模型名称已存在:de.scrum\u master.stackoverflow.ServiceModelNameReadyExistsException
2018年12月10日下午12:51:50 de.scrum_master.stackoverflow.OnboardingController createServiceModel
信息:服务当前不可用:de.scrum\u master.stackoverflow.ServiceUnavailableException
在我的IDE(IntelliJ IDEA)中,测试结果如下所示:


p.S.:

我知道你是新来的。这是你的自由球。下次请提供一个,即一个最小的、可编译的和可执行的示例,而不仅仅是一个没有包名、导入和测试类的代码段。您需要有关Spock的帮助,因此请编写一个Spock规范(测试类),向我们展示并解释您的问题。这样,我们就不需要从头开始重新创建您的情况,而只需要专注于修复您的测试和解决您的问题


你很幸运,我只是觉得有点无聊,等待客人的到来,否则我不会这么做。说“我什么都没有,请为我做一切”只能说明你很懒。如果你需要帮助,让别人更容易帮助你,并对他们的时间预算表示尊重。他们是免费的

请原谅我犯了这个错误。从现在起,这将不再重复,我将确保更加准确。仍然习惯于:(…但是非常感谢你的帮助,我非常感谢你的姿态。然后我也非常感谢你接受并投票支持我的回答。
package com.service.onboarding.business;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.service.onboarding.business.api.OnboardingService;
import com.service.onboarding.business.servicemanagement.ServiceModelRepository;
import com.service.onboarding.domain.exception.MalformedContentException;
import com.service.onboarding.domain.exception.ServiceModelDoesNotExistException;
import com.service.onboarding.domain.exception.ServiceModelInUseException;
import com.service.onboarding.domain.exception.ServiceModelNameAlreadyExistsException;
import com.onboarding.domain.exception.ServiceUnavailableException;
import com.service.onboarding.domain.requestdata.ServiceModelPaginationFilter;
import com.service.onboarding.domain.requestdata.ServiceModelRequestData;
import com.service.onboarding.domain.resource.Greeting;
import com.service.onboarding.domain.resource.ServiceModel;
import com.service.onboarding.domain.resource.ServiceModelDetail;
import com.service.onboarding.domain.responsedata.PaginatedServiceResponseData;

/*
 * Sample service to demonstrate what the API would use to get things done
 */
@Service
public class OnboardingServiceImpl implements OnboardingService {

    private final AtomicLong counter = new AtomicLong();

    private static final String TEMPLATE = "Hello, %s!";

    private static final Logger LOG = LoggerFactory.getLogger(OnboardingServiceImpl.class);

    @Autowired
    private ServiceModelRepository serviceModelRepository;


    public OnboardingServiceImpl() {
    }

    @Override
    public Greeting getPersonalGreeting(final String name) {
        return new Greeting(counter.incrementAndGet(),
                String.format(TEMPLATE, name));
    }
 @Override
    public ServiceModelDetail createServiceModel(final ServiceModelRequestData serviceModelRequestData) throws MalformedContentException, ServiceModelNameAlreadyExistsException, ServiceUnavailableException {
        return serviceModelRepository.create(serviceModelRequestData);
    }