【问题标题】:How to mock @Autowired HttpServletRequest in Service Test class?如何在服务测试类中模拟 @Autowired HttpServletRequest?
【发布时间】:2020-03-04 19:14:21
【问题描述】:

在我的服务类中,我有 @Autowired HttpServletRequest 并在我的服务方法中使用相同的对象,但对于该服务方法测试类,我无法在我的测试方法中模拟 HttpServletRequest 对象,请检查以下代码。我收到请求对象的空指针异常

    @Component("someServiceClass")
    public class SomeServiceClassImpl implements SomeServiceClass {

        @Autowired
        private HttpServletRequest request;

        @Autowired
        private HttpServletResponse response;

        @Override
        public void method(String id) {
            String param = request.getParameter("param");
// Here i am getting request object as null
        }

    }
    public class SomeServiceClassImplTest {

        @Mock
        private HttpServletRequest request;

        @Mock
        private HttpServletResponse response;

        @InjectMocks
        private SomeServiceClassImpl someServiceClass;

        @Before
        public void setup() {
            MockitoAnnotations.initMocks(this);
        }

        @Test
        public void methodTest() {
            Mockito.when(request.getParameter(Mockito.any())).thenReturn("dm");

        }

    }

【问题讨论】:

  • 以上代码工作正常。它的@InjectMocks 不是@InjectMock

标签: spring-boot junit mockito


【解决方案1】:

我遇到了这个问题,当我添加@WebAppConfiguration 时,它就解决了。

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class SomeServiceClassImplTest {

    @InjectMocks
    private SomeServiceClassImpl someServiceClass;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void methodTest() {
        Mockito.when(request.getParameter(Mockito.any())).thenReturn("dm");

    }

}

【讨论】:

    【解决方案2】:

    你有没有初始化这些模拟对象?,否则你得到空指针异常

      @Before public void initMocks() {
       MockitoAnnotations.initMocks(this);
    

    }

    【讨论】:

      【解决方案3】:

      看来你的班级错过了@RunWith注解,所以模拟没有初始化

      添加@RunWith(MockitoJUnitRunner.class)(或SpringRunner),即可解决。

      一般来说,我认为使用构造函数而不是字段自动装配会更好。我知道这是风格问题,但这样做可以解决使用 InjectMocks 或任何其他基于反射的工具的需要。

      【讨论】:

        【解决方案4】:

        setup() 方法被调用了吗?

        你不应该添加一个@RunWith注解来指定一个将执行标记为@Before的方法的运行器吗?

        例如,您可以使用@RunWith(MockitoJUnitRunner.class) 标记您的班级

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-18
          • 2015-07-07
          • 1970-01-01
          • 1970-01-01
          • 2019-12-17
          相关资源
          最近更新 更多