diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/MockInvoker.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/MockInvoker.java index 41a554557d9..6bd4dff11f5 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/MockInvoker.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/MockInvoker.java @@ -161,14 +161,15 @@ public static Throwable getThrowable(String throwstr) { } @SuppressWarnings("unchecked") - private Invoker getInvoker(String mockService) { + private Invoker getInvoker(String mock) { + Class serviceType = (Class) ReflectUtils.forName(url.getServiceInterface()); + String mockService = ConfigUtils.isDefault(mock) ? serviceType.getName() + "Mock" : mock; Invoker invoker = (Invoker) MOCK_MAP.get(mockService); if (invoker != null) { return invoker; } - Class serviceType = (Class) ReflectUtils.forName(url.getServiceInterface()); - T mockObject = (T) getMockObject(mockService, serviceType); + T mockObject = (T) getMockObject(mock, serviceType); invoker = PROXY_FACTORY.getInvoker(mockObject, serviceType, url); if (MOCK_MAP.size() < 10000) { MOCK_MAP.put(mockService, invoker); diff --git a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/DemoServiceA.java b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/DemoServiceA.java new file mode 100644 index 00000000000..54318360dfc --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/DemoServiceA.java @@ -0,0 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.dubbo.rpc.support; + +public interface DemoServiceA { + String methodA(); +} diff --git a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/DemoServiceAMock.java b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/DemoServiceAMock.java new file mode 100644 index 00000000000..23c623ac1f5 --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/DemoServiceAMock.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.dubbo.rpc.support; + +/** + * default mock service for DemoServiceA + */ +public class DemoServiceAMock implements DemoServiceA{ + public static final String MOCK_VALUE = "mockA"; + @Override + public String methodA() { + return MOCK_VALUE; + } +} diff --git a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/DemoServiceB.java b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/DemoServiceB.java new file mode 100644 index 00000000000..a2350a5daa4 --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/DemoServiceB.java @@ -0,0 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.dubbo.rpc.support; + +public interface DemoServiceB { + String methodB(); +} diff --git a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/DemoServiceBMock.java b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/DemoServiceBMock.java new file mode 100644 index 00000000000..ffc199dc862 --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/DemoServiceBMock.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.dubbo.rpc.support; + +/** + * default mock service for DemoServiceA + */ +public class DemoServiceBMock implements DemoServiceB { + public static final String MOCK_VALUE = "mockB"; + + @Override + public String methodB() { + return MOCK_VALUE; + } +} diff --git a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/MockInvokerTest.java b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/MockInvokerTest.java index b40951a08ac..646c789e2ee 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/MockInvokerTest.java +++ b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/MockInvokerTest.java @@ -65,6 +65,31 @@ public void testInvoke() { mockInvoker.invoke(invocation).getObjectAttachments()); } + @Test + public void testGetDefaultObject() { + // test methodA in DemoServiceAMock + final Class demoServiceAClass = DemoServiceA.class; + URL url = URL.valueOf("remote://1.2.3.4/" + demoServiceAClass.getName()); + url = url.addParameter(MOCK_KEY, "force:true"); + MockInvoker mockInvoker = new MockInvoker(url, demoServiceAClass); + + RpcInvocation invocation = new RpcInvocation(); + invocation.setMethodName("methodA"); + Assertions.assertEquals(new HashMap<>(), + mockInvoker.invoke(invocation).getObjectAttachments()); + + // test methodB in DemoServiceBMock + final Class demoServiceBClass = DemoServiceB.class; + url = URL.valueOf("remote://1.2.3.4/" + demoServiceBClass.getName()); + url = url.addParameter(MOCK_KEY, "force:true"); + mockInvoker = new MockInvoker(url, demoServiceBClass); + invocation = new RpcInvocation(); + invocation.setMethodName("methodB"); + Assertions.assertEquals(new HashMap<>(), + mockInvoker.invoke(invocation).getObjectAttachments()); + } + + @Test public void testInvokeThrowsRpcException1() { URL url = URL.valueOf("remote://1.2.3.4/" + String.class.getName());