我想测试当我调用这样的方法时抛出我的自定义异常:
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());
}
}
答案 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的单元测试。如果要测试控制器,则应使用SpringRunner
,SpringBootTest
和MockMvc
进行测试。但首先,对您的服务进行单元测试,然后在您的控制器上添加其他测试。对于控制器,您将使用@MockBean
注释MyService并抛出,或Autowire
它和@MockBean
内部的映射器返回一个空对象,如单元测试。
请检查:https://spring.io/guides/gs/testing-web/
老答案:您可以将方法更改为protected
,假设您的测试与您正在测试的类位于同一个包中,您将可以模拟它。
要模拟你的方法,你需要这样写:
when(myService.queryDatabase(anyString(),anyString())).thenThrow(EmptyResultException.class);
您忘记使用when
方法来打电话。