JUnit测试抛出@httpStatus的自定义异常

时间:2018-02-27 19:41:00

标签: java spring junit powermockito

我想测试当我调用这样的方法时抛出我的自定义异常:

private MyObject queryDatabase(String request, String end){
    HttpEntity myEntity = new NStringEntity(request, ContentType.APPLICATION_JSON)
    Response response = restClient.performRequest("GET", end,Collections.emptyMap(), myEntity)

    MyObject myObject = mapper.readValue(response.getEntity().getContent(), MyObject.Class);
    if(myObject.getFunctions().isEmpty()){
        throw new EmptyResultException("Empty result");
    }
    return myObject;
}

我的EmptyResultException班级:

@ResponseStatus(value=HttpStatus.NO_CONTENT)
public Class EmptyResultException() extends RuntimeException(){
    ...
}

我刚刚开始使用JUnit,我尝试过:

@Mock MyService myservice;

@Test(expected=EmptyResultException.class)
public void shouldReturnException() {
    when(myService.queryDatabase(anyString(),anyString())).thenReturn(new MyObject());
}

它不起作用。我想尝试的行为是private方法。我似乎应该使用Powermock来处理这种情况。但是,我已经读过测试private方法并不好,所以我想将我的方法改为public。有什么帮助吗?

编辑:我的全面实施:

我有一个Restcontroller:

@RestController
@RequestMapping...
public class MyController {

    @Autowired 
    MyService myService;

    @RequestMapping...
    public MyObject findObject(@Valid DtoParameters parameters){
      return myService.executeQuery(parameters);
   }
   }

在myService Class中:

@Service
public class MyService{

public MyObject executeQuery(DtoParameters parameters){
 return 
    queryDatabase(parameters.buildRequest(),parameters.buildEnd());

}
}

1 个答案:

答案 0 :(得分:1)

如果您的考试成绩为MyService,则该成绩不应为@Mock

我不知道你的整个实现,但我们假设MyService注入了依赖项(比如你的mapper

首先我会嘲笑映射器并将其注入MyService

@Mock
private ObjectMapper mapper;

@InjectMocks
private MyService myService;

为此,您的测试类需要使用mockito runner。您可以使用以下方法注释您的课程:

@RunWith(MockitoJUnitRunner.class)

模拟将注入MyService。 现在,您可以模拟映射器以返回空对象:

when(mapper.readValue(any(),any())).thenReturn(new MyObject());
myService.queryDatabase("request", "end")

调用queryDatabase时,这应该调用mock里面。

如果您尝试测试其他控制器,则采用不同的方式。我建议的是MyService的单元测试。如果要测试控制器,则应使用SpringRunnerSpringBootTestMockMvc进行测试。但首先,对您的服务进行单元测试,然后在您的控制器上添加其他测试。对于控制器,您将使用@MockBean注释MyService并抛出,或Autowire它和@MockBean内部的映射器返回一个空对象,如单元测试。

请检查:https://spring.io/guides/gs/testing-web/

老答案:

您可以将方法更改为protected,假设您的测试与您正在测试的类位于同一个包中,您将可以模拟它。

要模拟你的方法,你需要这样写:

when(myService.queryDatabase(anyString(),anyString())).thenThrow(EmptyResultException.class);

您忘记使用when方法来打电话。