Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Junit Spring集成-如何模拟输入通道_Junit_Mockito_Spring Integration - Fatal编程技术网

Junit Spring集成-如何模拟输入通道

Junit Spring集成-如何模拟输入通道,junit,mockito,spring-integration,Junit,Mockito,Spring Integration,我是Spring集成的新手,如果我的问题很荒谬,请原谅并纠正我。我正在尝试为Spring集成应用程序编写单元测试用例,在这里我只测试控制器,并希望模拟服务调用 测试: @RunWith(PowerMockRunner.class) @PrepareForTest({HeaderUtils.class}) @PowerMockIgnore({ "javax.management.*", "javax.script.*" }) public class Doc

我是Spring集成的新手,如果我的问题很荒谬,请原谅并纠正我。我正在尝试为Spring集成应用程序编写单元测试用例,在这里我只测试控制器,并希望模拟服务调用

测试:

@RunWith(PowerMockRunner.class)
@PrepareForTest({HeaderUtils.class})
@PowerMockIgnore({ "javax.management.*", "javax.script.*" })
public class DocMgmtImplTestPower {

    private MockMvc mvc;

    @InjectMocks
    private DocMgmtImpl docMgmtImpl;

    @Mock
    DocMgmtService docMgmtServiceGateway;

    @Mock
    SendComnMsgResponse sendComnMsgResponse;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this); //
        mvc = MockMvcBuilders.standaloneSetup(DocMgmtImpl.class).build();

        PowerMockito.mockStatic(HeaderUtils.class, new Answer<Map<String, Object>>() {

            @Override
            public Map<String, Object> answer(InvocationOnMock arg0) throws Throwable {
                Map<String, Object> headers = new HashMap<String, Object>();
                HeaderInfo headerInfo = new HeaderInfo();               
                headers.put(BusinessServiceConstants.SERVICE_HEADER, headerInfo);
                return headers;
            }
        });
    }

    @SuppressWarnings("deprecation")
    @Test
    public void testMethod() throws Exception {
        SpecialFormMsgRequest arg = new SpecialFormMsgRequest();
        Map<String, Object> headers = new HashMap<String, Object>();
        Mockito.when(docMgmtServiceGateway.specialFormMsg(Mockito.any(SpecialFormMsgRequest.class),
                (Matchers.<Map<String, Object>>any()))).thenReturn(new SendComnMsgResponse());
        
        SpecialFormMsgRequest msg = new SpecialFormMsgRequest();
        msg.setUiStaticDocFlag("N");
        mvc.perform(post("/specialMsg").accept(MediaType.APPLICATION_JSON).content(asJsonString(msg))
                .contentType(MediaType.APPLICATION_JSON)).andDo(print()).andExpect(status().isOk());
    }

    public static String asJsonString(final Object obj) {
        try {
            return new ObjectMapper().writeValueAsString(obj);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
@Controller
public class DocMgmtImpl implements DocMgmt {
    @Autowired
    **DocMgmtService docMgmtServiceGateway;**   **// I want to mock this service.**
    
    @Override
    @RequestMapping(value = "/specialMsg", method = RequestMethod.POST)
    @ResponseBody
    public SendComnMsgResponse specialMsg(@Valid @RequestBody final SpecialFormMsgRequest specialFormMsgRequest)
            throws BusinessException, TechnicalException {

        SendComnMsgResponse sendComnMsgResponse = null;
        try {
            Map<String, Object> headers = HeaderUtils.getHeaders(poBusinessHeader); // PowerMockito working here...     
            
            sendComnMsgResponse = **this.docMgmtServiceGateway.specialFormMsg(specialFormMsgRequest, headers);** // docMgmtServiceGateway is getting null...
        } catch (Exception exception) {
            handleException(exception);
        }
        return sendComnMsgResponse;
    }
}
<int:gateway id="docMgmtServiceGateway" service-interface="group.doc.svc.gateway.DocMgmtService"
    default-reply-channel="docReplyChannel" error-channel="docErrorChannel">    
    
        <int:method name="sendComnMsg" request-channel="sendComnMsgRequestChannel" />   
        
</int:gateway>
<int:chain input-channel="esDBBISendComnMsgRequestChannel" output-channel="docReplyChannel">
        <int:transformer method="formatRequest" ref="esSendComnMsgTransformer"/>
        <int:service-activator ref="sendComnMsgActivator" method="sendComnMsg" />
        <int:transformer method="parseResponse" ref="esSendComnMsgTransformer"/>
</int:chain>
@RunWith(PowerMockRunner.class)
@PrepareForTest({HeaderUtils.class})
@PowerMockIgnore({“javax.management.*,”javax.script.*})
公共类docmgmtimplatestpower{
私有MockMvc;
@注射模拟
私有DocMgmtImpl DocMgmtImpl;
@嘲弄
DocMgmtService DocMgmtService网关;
@嘲弄
SendComnMsgResponse SendComnMsgResponse;
@以前
公共void init(){
initMocks(this)//
mvc=MockMvcBuilders.standaloneSetup(DocMgmtImpl.class).build();
mockStatic(HeaderUtils.class,new Answer()){
@凌驾
公共映射应答(InvocationMock arg0)抛出可丢弃的{
Map headers=newhashmap();
HeaderInfo HeaderInfo=新HeaderInfo();
headers.put(BusinessServiceConstants.SERVICE_HEADER,headerInfo);
返回标题;
}
});
}
@抑制警告(“弃用”)
@试验
public void testMethod()引发异常{
SpecialFormMsgRequest arg=新的SpecialFormMsgRequest();
Map headers=newhashmap();
Mockito.when(docMgmtServiceGateway.specialFormMsg)(Mockito.any(SpecialFormMsgRequest.class)),
(Matchers.any())),然后返回(new SendComnMsgResponse());
SpecialFormMsgRequest msg=新建SpecialFormMsgRequest();
msg.setUiStaticDocFlag(“N”);
mvc.perform(post(“/specialMsg”).accept(MediaType.APPLICATION_JSON).content(asJsonString(msg))
.contentType(MediaType.APPLICATION_JSON)).andDo(print()).andExpect(status().isOk());
}
公共静态字符串asJsonString(最终对象obj){
试一试{
返回新的ObjectMapper().writeValueAsString(obj);
}捕获(例外e){
抛出新的运行时异常(e);
}
}
}
控制器:

@RunWith(PowerMockRunner.class)
@PrepareForTest({HeaderUtils.class})
@PowerMockIgnore({ "javax.management.*", "javax.script.*" })
public class DocMgmtImplTestPower {

    private MockMvc mvc;

    @InjectMocks
    private DocMgmtImpl docMgmtImpl;

    @Mock
    DocMgmtService docMgmtServiceGateway;

    @Mock
    SendComnMsgResponse sendComnMsgResponse;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this); //
        mvc = MockMvcBuilders.standaloneSetup(DocMgmtImpl.class).build();

        PowerMockito.mockStatic(HeaderUtils.class, new Answer<Map<String, Object>>() {

            @Override
            public Map<String, Object> answer(InvocationOnMock arg0) throws Throwable {
                Map<String, Object> headers = new HashMap<String, Object>();
                HeaderInfo headerInfo = new HeaderInfo();               
                headers.put(BusinessServiceConstants.SERVICE_HEADER, headerInfo);
                return headers;
            }
        });
    }

    @SuppressWarnings("deprecation")
    @Test
    public void testMethod() throws Exception {
        SpecialFormMsgRequest arg = new SpecialFormMsgRequest();
        Map<String, Object> headers = new HashMap<String, Object>();
        Mockito.when(docMgmtServiceGateway.specialFormMsg(Mockito.any(SpecialFormMsgRequest.class),
                (Matchers.<Map<String, Object>>any()))).thenReturn(new SendComnMsgResponse());
        
        SpecialFormMsgRequest msg = new SpecialFormMsgRequest();
        msg.setUiStaticDocFlag("N");
        mvc.perform(post("/specialMsg").accept(MediaType.APPLICATION_JSON).content(asJsonString(msg))
                .contentType(MediaType.APPLICATION_JSON)).andDo(print()).andExpect(status().isOk());
    }

    public static String asJsonString(final Object obj) {
        try {
            return new ObjectMapper().writeValueAsString(obj);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
@Controller
public class DocMgmtImpl implements DocMgmt {
    @Autowired
    **DocMgmtService docMgmtServiceGateway;**   **// I want to mock this service.**
    
    @Override
    @RequestMapping(value = "/specialMsg", method = RequestMethod.POST)
    @ResponseBody
    public SendComnMsgResponse specialMsg(@Valid @RequestBody final SpecialFormMsgRequest specialFormMsgRequest)
            throws BusinessException, TechnicalException {

        SendComnMsgResponse sendComnMsgResponse = null;
        try {
            Map<String, Object> headers = HeaderUtils.getHeaders(poBusinessHeader); // PowerMockito working here...     
            
            sendComnMsgResponse = **this.docMgmtServiceGateway.specialFormMsg(specialFormMsgRequest, headers);** // docMgmtServiceGateway is getting null...
        } catch (Exception exception) {
            handleException(exception);
        }
        return sendComnMsgResponse;
    }
}
<int:gateway id="docMgmtServiceGateway" service-interface="group.doc.svc.gateway.DocMgmtService"
    default-reply-channel="docReplyChannel" error-channel="docErrorChannel">    
    
        <int:method name="sendComnMsg" request-channel="sendComnMsgRequestChannel" />   
        
</int:gateway>
<int:chain input-channel="esDBBISendComnMsgRequestChannel" output-channel="docReplyChannel">
        <int:transformer method="formatRequest" ref="esSendComnMsgTransformer"/>
        <int:service-activator ref="sendComnMsgActivator" method="sendComnMsg" />
        <int:transformer method="parseResponse" ref="esSendComnMsgTransformer"/>
</int:chain>
@控制器
公共类DocMgmtImpl实现DocMgmt{
@自动连线
**DocMgmtService docMgmtServiceGateway;***//我想模拟此服务**
@凌驾
@RequestMapping(value=“/specialMsg”,method=RequestMethod.POST)
@应答器
public SendComnMsgResponse specialMsg(@Valid@RequestBody final SpecialFormMsgRequest SpecialFormMsgRequest)
抛出BusinessException、TechnicalException{
SendComnMsgResponse SendComnMsgResponse=null;
试一试{
Map headers=HeaderUtils.getHeaders(poBusinessHeader);//PowerMockito正在这里工作。。。
sendComnMsgResponse=**this.docMgmtServiceGateway.specialFormMsg(specialFormMsgRequest,headers);**//docMgmtServiceGateway正在获取null。。。
}捕获(异常){
handleException(异常);
}
返回sendComnMsgResponse;
}
}
Gateway.xml:

@RunWith(PowerMockRunner.class)
@PrepareForTest({HeaderUtils.class})
@PowerMockIgnore({ "javax.management.*", "javax.script.*" })
public class DocMgmtImplTestPower {

    private MockMvc mvc;

    @InjectMocks
    private DocMgmtImpl docMgmtImpl;

    @Mock
    DocMgmtService docMgmtServiceGateway;

    @Mock
    SendComnMsgResponse sendComnMsgResponse;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this); //
        mvc = MockMvcBuilders.standaloneSetup(DocMgmtImpl.class).build();

        PowerMockito.mockStatic(HeaderUtils.class, new Answer<Map<String, Object>>() {

            @Override
            public Map<String, Object> answer(InvocationOnMock arg0) throws Throwable {
                Map<String, Object> headers = new HashMap<String, Object>();
                HeaderInfo headerInfo = new HeaderInfo();               
                headers.put(BusinessServiceConstants.SERVICE_HEADER, headerInfo);
                return headers;
            }
        });
    }

    @SuppressWarnings("deprecation")
    @Test
    public void testMethod() throws Exception {
        SpecialFormMsgRequest arg = new SpecialFormMsgRequest();
        Map<String, Object> headers = new HashMap<String, Object>();
        Mockito.when(docMgmtServiceGateway.specialFormMsg(Mockito.any(SpecialFormMsgRequest.class),
                (Matchers.<Map<String, Object>>any()))).thenReturn(new SendComnMsgResponse());
        
        SpecialFormMsgRequest msg = new SpecialFormMsgRequest();
        msg.setUiStaticDocFlag("N");
        mvc.perform(post("/specialMsg").accept(MediaType.APPLICATION_JSON).content(asJsonString(msg))
                .contentType(MediaType.APPLICATION_JSON)).andDo(print()).andExpect(status().isOk());
    }

    public static String asJsonString(final Object obj) {
        try {
            return new ObjectMapper().writeValueAsString(obj);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
@Controller
public class DocMgmtImpl implements DocMgmt {
    @Autowired
    **DocMgmtService docMgmtServiceGateway;**   **// I want to mock this service.**
    
    @Override
    @RequestMapping(value = "/specialMsg", method = RequestMethod.POST)
    @ResponseBody
    public SendComnMsgResponse specialMsg(@Valid @RequestBody final SpecialFormMsgRequest specialFormMsgRequest)
            throws BusinessException, TechnicalException {

        SendComnMsgResponse sendComnMsgResponse = null;
        try {
            Map<String, Object> headers = HeaderUtils.getHeaders(poBusinessHeader); // PowerMockito working here...     
            
            sendComnMsgResponse = **this.docMgmtServiceGateway.specialFormMsg(specialFormMsgRequest, headers);** // docMgmtServiceGateway is getting null...
        } catch (Exception exception) {
            handleException(exception);
        }
        return sendComnMsgResponse;
    }
}
<int:gateway id="docMgmtServiceGateway" service-interface="group.doc.svc.gateway.DocMgmtService"
    default-reply-channel="docReplyChannel" error-channel="docErrorChannel">    
    
        <int:method name="sendComnMsg" request-channel="sendComnMsgRequestChannel" />   
        
</int:gateway>
<int:chain input-channel="esDBBISendComnMsgRequestChannel" output-channel="docReplyChannel">
        <int:transformer method="formatRequest" ref="esSendComnMsgTransformer"/>
        <int:service-activator ref="sendComnMsgActivator" method="sendComnMsg" />
        <int:transformer method="parseResponse" ref="esSendComnMsgTransformer"/>
</int:chain>

si-chain.xml:

@RunWith(PowerMockRunner.class)
@PrepareForTest({HeaderUtils.class})
@PowerMockIgnore({ "javax.management.*", "javax.script.*" })
public class DocMgmtImplTestPower {

    private MockMvc mvc;

    @InjectMocks
    private DocMgmtImpl docMgmtImpl;

    @Mock
    DocMgmtService docMgmtServiceGateway;

    @Mock
    SendComnMsgResponse sendComnMsgResponse;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this); //
        mvc = MockMvcBuilders.standaloneSetup(DocMgmtImpl.class).build();

        PowerMockito.mockStatic(HeaderUtils.class, new Answer<Map<String, Object>>() {

            @Override
            public Map<String, Object> answer(InvocationOnMock arg0) throws Throwable {
                Map<String, Object> headers = new HashMap<String, Object>();
                HeaderInfo headerInfo = new HeaderInfo();               
                headers.put(BusinessServiceConstants.SERVICE_HEADER, headerInfo);
                return headers;
            }
        });
    }

    @SuppressWarnings("deprecation")
    @Test
    public void testMethod() throws Exception {
        SpecialFormMsgRequest arg = new SpecialFormMsgRequest();
        Map<String, Object> headers = new HashMap<String, Object>();
        Mockito.when(docMgmtServiceGateway.specialFormMsg(Mockito.any(SpecialFormMsgRequest.class),
                (Matchers.<Map<String, Object>>any()))).thenReturn(new SendComnMsgResponse());
        
        SpecialFormMsgRequest msg = new SpecialFormMsgRequest();
        msg.setUiStaticDocFlag("N");
        mvc.perform(post("/specialMsg").accept(MediaType.APPLICATION_JSON).content(asJsonString(msg))
                .contentType(MediaType.APPLICATION_JSON)).andDo(print()).andExpect(status().isOk());
    }

    public static String asJsonString(final Object obj) {
        try {
            return new ObjectMapper().writeValueAsString(obj);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
@Controller
public class DocMgmtImpl implements DocMgmt {
    @Autowired
    **DocMgmtService docMgmtServiceGateway;**   **// I want to mock this service.**
    
    @Override
    @RequestMapping(value = "/specialMsg", method = RequestMethod.POST)
    @ResponseBody
    public SendComnMsgResponse specialMsg(@Valid @RequestBody final SpecialFormMsgRequest specialFormMsgRequest)
            throws BusinessException, TechnicalException {

        SendComnMsgResponse sendComnMsgResponse = null;
        try {
            Map<String, Object> headers = HeaderUtils.getHeaders(poBusinessHeader); // PowerMockito working here...     
            
            sendComnMsgResponse = **this.docMgmtServiceGateway.specialFormMsg(specialFormMsgRequest, headers);** // docMgmtServiceGateway is getting null...
        } catch (Exception exception) {
            handleException(exception);
        }
        return sendComnMsgResponse;
    }
}
<int:gateway id="docMgmtServiceGateway" service-interface="group.doc.svc.gateway.DocMgmtService"
    default-reply-channel="docReplyChannel" error-channel="docErrorChannel">    
    
        <int:method name="sendComnMsg" request-channel="sendComnMsgRequestChannel" />   
        
</int:gateway>
<int:chain input-channel="esDBBISendComnMsgRequestChannel" output-channel="docReplyChannel">
        <int:transformer method="formatRequest" ref="esSendComnMsgTransformer"/>
        <int:service-activator ref="sendComnMsgActivator" method="sendComnMsg" />
        <int:transformer method="parseResponse" ref="esSendComnMsgTransformer"/>
</int:chain>

我想知道,我做的是否正确。因为DocMgmtService服务是一个接口,它没有实现。控制器调用后,按上述配置转到Transformer。在这个设置中,我有以下问题

  • 我可以用相同的设置模拟DocMgmtService吗?如果不是,正确的方法是什么
  • 如果是的话,我怎么能嘲笑我的服务呢。 谢谢

  • 这完全取决于你想要测试什么

    如果您模拟接口,那么您要测试的就是该接口的模拟存根(无意义)

    框架创建接口的一个实现,该接口从参数创建消息并将其发送到通道

    您应该将网关自动连接到测试中并调用它


    您可以根据需要模拟任何下游组件(例如,
    sendComnMsgActivator
    )。

    谢谢您的回复。是的,你的回答是正确的,我必须自动连接网关。但我已经试过了,结果是无效的。您能建议如何使用现有设置@Autowired网关吗?谢谢,我得到了它,而不是PowerMockito,我使用SpringJUnit4ClassRunner,仅此而已;我的电话是来变压器。再次感谢你救了我。