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);

代码中存在多个问题

  • 您不是在模拟构造函数调用SomeClass Obj=newsomeclass()上面带有
    @Mock
    SomeClass
    字段在这里不起作用。这个地方需要PowerMock

    PowerMockito.whenNew(SomeClass.class).withNoArguments().thenReturn(someClass);
    
  • 在您应该模拟特定方法
    getData()
    以引发异常之后,但在执行确切的测试请求之前

    Mockito.doThrow(new IllegalArgumentException()).when(someClass).getData();
    
  • 为了让PowerMock增强类,您需要在类级别上使用
    @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);  
        }
    }