java - Spring & Mockito : Actual Object getting called in Unit Test

标签 java spring unit-testing junit mockito

这是我要测试的类(class),

    public class AuthErrorResponseWriter  {

        @Autowired
        TransResponse svcResponse;


        @Override
        public void writeResponse(HttpServletResponse response) {


            //Set the Http status
            response.setStatus(HttpStatus.FORBIDDEN.value());
            svcResponse.setMessage(Constants.AUTHENTICATION_ERROR);
            svcResponse.setStatus(HttpStatus.FORBIDDEN.toString());

            ObjectMapper mapper = new ObjectMapper();

            //Write the response
            try {
                Writer writer = response.getWriter();
                writer.write(mapper.writeValueAsString(svcResponse));
                writer.flush();
                writer.close();
            } catch (IOException ioex) {
                logger.error("Problem producing authentication error http response",ioex);  
            }
    }

}

我编写的单元测试代码如下,

RunWith(SpringRunner.class)
@WebMvcTest({AuthErrorResponseWriter  .class})
@ComponentScan("com.demo.service")
public class AuthErrorResponseWriterTest {

    @Mock
    HttpServletResponse responseMock;


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

    @Test
    public void testResponse(){

        TransResponse mockResponse = new TransResponse();

        mockResponse.setMessage(Constants.AUTHENTICATION_ERROR);
        mockResponse.setStatus(HttpStatus.FORBIDDEN.toString());

        AuthErrorResponseWriter   authErrorWriter = new AuthErrorResponseWriter  (); 
        PrintWriter writerMock = mock(PrintWriter.class);

        try {
            when(responseMock.getWriter()).thenReturn(writerMock);
        } catch (IOException ioex) {
            //assertTrue(false);
        }
        authErrorWriter.writeResponse(responseMock);
        verify(responseMock).setStatus(HttpStatus.FORBIDDEN.value());

    }

}

当我执行此 Junit 时,出现空指针异常

svcResponse.setMessage(Constants.AUTHENTICATION_ERROR);

svcResponse 为 null,即使我已经 mock 了它。

请有人指出我为什么它不拾取模拟对象并寻找实际对象。

另外,我编写 Junit 是否是正确的方法?

最佳答案

您可能想使用 Mockito 的运行程序而不是 Spring(据我所知,您根本不需要 Spring 的上下文):

@RunWith(MockitoJUnitRunner.class)
public class SubscriptionServiceTest {

    @InjectMocks
    private AuthErrorResponseWriter authErrorResponseWriter;

    @Mock
    TransResponse svcResponse;

    @Mock
    HttpServletResponse responseMock;

    ....

    authErrorWriter.writeResponse(responseMock);

关于java - Spring & Mockito : Actual Object getting called in Unit Test,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41640907/

相关文章:

javascript - dojo 中的单元测试

java - 如何使用struts2通过ajax进行编辑

java - 为每个键在多个 JVM 上自动更新整数

java - 使用假 smtp 服务器生成 MailSendException

java - Spring - 将任务安排在某个时间段

java.sql.DriverManager 无法识别 java.sql.Driver stub

java - 业务方法中的错误检查,也就是进行防御性编程

java - org.springframework.web.servlet.DispatcherServlet noHandlerFound 404错误响应

java - java中如何找到多个数组中的最大值并返回第一个索引的值?

java - 使用 Spring JDBC 获取 SQL 插入后生成的 key