Java 未在junit中执行控制器内的异常
我有一个控制器类,类似这样:Java 未在junit中执行控制器内的异常,java,junit,mockito,Java,Junit,Mockito,我有一个控制器类,类似这样: @Controller public class ExampleController { @RequestMapping(value = "/samplePage") public ResponseEntity getSampleDetails() { SomeClass Obj = new SomeClass() try{ response = Obj.getData(); return n
@Controller
public class ExampleController
{
@RequestMapping(value = "/samplePage")
public ResponseEntity getSampleDetails()
{
SomeClass Obj = new SomeClass()
try{
response = Obj.getData();
return new ResponseEntity<>(response,HttpStatus.Ok)
}
catch(IllegalArgumentException e)
{
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
然而,当我运行代码时,我得到了一个错误
响应状态值200的范围应为:服务器错误,但为:成功
如何测试异常?您的问题是,在实际调用被测单元(控制器)之后,您正在设置模拟。您应该首先设置模型并执行调用:
Mockito.doThrow(new IllegalArgumentException()).when(someClass).getData();
exampleControllerMockMvc.perform(get("/samplePage")).andExpect(status().is5xxServerError);
代码中存在多个问题
@Mock
的SomeClass
字段在这里不起作用。这个地方需要PowerMock
PowerMockito.whenNew(SomeClass.class).withNoArguments().thenReturn(someClass);
getData()
以引发异常之后,但在执行确切的测试请求之前
Mockito.doThrow(new IllegalArgumentException()).when(someClass).getData();
@PrepareForTest(ExampleController.class)
exampleControllerTest
->exampleControllerTest
@RunWith(PowerMockRunner.class)
@PrepareForTest(ExampleController.class)
public class ExampleControllerTest
{
private SomeClass someClass;
private MockMvc exampleControllerMockMvc;
@Before
public void before() {
someClass = Mockito.mock(SomeClass.class);
PowerMockito.whenNew(SomeClass.class).withNoArguments().thenReturn(someClass);
exampleControllerMockMvc = MockMvcBuilders.standaloneSetup(new ExampleController())
.build();
}
@Test
public void exampleControllerTest_IllegalArgumentException_throwsInternalException() {
Mockito.doThrow(new IllegalArgumentException).when(someClass).getData();
exampleControllerMockMvc.perform(get("/samplePage"))
.andExpect(status().is5xxServerError);
}
}
希望有帮助 我认为你的括号放错地方了:
Mockito.doThrow(新的illegargumentexception).when(someClass.getData())
ExampleController
创建了一个新的SomeClass
实例,这使得测试变得困难@自动连线SomeClass
,然后测试中的模拟可用,并且不需要使用PowerMock。
@RunWith(PowerMockRunner.class)
@PrepareForTest(ExampleController.class)
public class ExampleControllerTest
{
private SomeClass someClass;
private MockMvc exampleControllerMockMvc;
@Before
public void before() {
someClass = Mockito.mock(SomeClass.class);
PowerMockito.whenNew(SomeClass.class).withNoArguments().thenReturn(someClass);
exampleControllerMockMvc = MockMvcBuilders.standaloneSetup(new ExampleController())
.build();
}
@Test
public void exampleControllerTest_IllegalArgumentException_throwsInternalException() {
Mockito.doThrow(new IllegalArgumentException).when(someClass).getData();
exampleControllerMockMvc.perform(get("/samplePage"))
.andExpect(status().is5xxServerError);
}
}